OSDN Git Service

merge original branch.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / Settings / SetLookAndFeelPage.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 "Globals.h"\r
22 #include "ShellUpdater.h"\r
23 #include "AppUtils.h"\r
24 #include "StringUtils.h"\r
25 #include ".\setlookandfeelpage.h"\r
26 #include "MessageBox.h"\r
27 #include "XPTheme.h"\r
28 #include "MenuInfo.h"\r
29 #include "ShellCache.h"\r
30 \r
31 extern MenuInfo menuInfo[];\r
32 \r
33 void InsertMenuItemToList(CListCtrl *list,CImageList *imagelist)\r
34 {\r
35         int i=0;\r
36         while(menuInfo[i].command != ShellMenuLastEntry)\r
37         {\r
38                 if(menuInfo[i].command != ShellSeparator &&\r
39                    menuInfo[i].command != ShellSubMenu &&\r
40                    menuInfo[i].command != ShellSubMenuFile &&\r
41                    menuInfo[i].command != ShellSubMenuFolder &&\r
42                    menuInfo[i].command != ShellSubMenuLink &&\r
43                    menuInfo[i].command != ShellSubMenuMultiple)\r
44                 {\r
45                         HICON hIcon = reinterpret_cast<HICON>(::LoadImage(AfxGetResourceHandle(),\r
46                                         MAKEINTRESOURCE(menuInfo[i].iconID),IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT ));\r
47 \r
48                         int nImage = imagelist -> Add(hIcon);\r
49 \r
50                         CString temp;\r
51                         temp.LoadString(menuInfo[i].menuTextID);\r
52                         CStringUtils::RemoveAccelerators(temp);\r
53                 \r
54                         int nIndex = list->GetItemCount();\r
55                         list->InsertItem(nIndex,temp,nImage);\r
56                         list->SetItemData(nIndex,i);\r
57                 }\r
58                 i++;\r
59         }\r
60 }\r
61 \r
62 void SetMenuItemCheck(CListCtrl *list, unsigned __int64 mask)\r
63 {\r
64         for(int i=0;i<list->GetItemCount();i++)\r
65         {\r
66                 int data = list->GetItemData(i);\r
67                 \r
68                 list->SetCheck(i,(menuInfo[data].menuID & mask) == menuInfo[data].menuID);\r
69         }\r
70 }\r
71 \r
72 unsigned __int64 GetMenuListMask(CListCtrl *list)\r
73 {\r
74         unsigned __int64 mask = 0;\r
75 \r
76         for(int i=0;i<list->GetItemCount();i++)\r
77         {               \r
78                 if(list->GetCheck(i))\r
79                 {\r
80                         int data = list->GetItemData(i);\r
81                         mask |= menuInfo[data].menuID ;\r
82                 }\r
83         }\r
84         return mask;\r
85 }\r
86 \r
87 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage, ISettingsPropPage)\r
88 CSetLookAndFeelPage::CSetLookAndFeelPage()\r
89         : ISettingsPropPage(CSetLookAndFeelPage::IDD)\r
90         , m_bBlock(false)\r
91 {\r
92         ShellCache cache;\r
93         m_regTopmenu = cache.menulayoutlow;\r
94         m_regTopmenuhigh = cache.menulayouthigh;\r
95 \r
96         m_topmenu = unsigned __int64(DWORD(m_regTopmenuhigh))<<32;\r
97         m_topmenu |= unsigned __int64(DWORD(m_regTopmenu));\r
98 \r
99         m_regNoContextPaths = CRegString(_T("Software\\TortoiseGit\\NoContextPaths"), _T(""));\r
100         m_sNoContextPaths = m_regNoContextPaths;\r
101         m_sNoContextPaths.Replace(_T("\n"), _T("\r\n"));\r
102 }\r
103 \r
104 CSetLookAndFeelPage::~CSetLookAndFeelPage()\r
105 {\r
106 }\r
107 \r
108 void CSetLookAndFeelPage::DoDataExchange(CDataExchange* pDX)\r
109 {\r
110         ISettingsPropPage::DoDataExchange(pDX);\r
111         DDX_Control(pDX, IDC_MENULIST, m_cMenuList);\r
112         DDX_Text(pDX, IDC_NOCONTEXTPATHS, m_sNoContextPaths);\r
113 }\r
114 \r
115 \r
116 BEGIN_MESSAGE_MAP(CSetLookAndFeelPage, ISettingsPropPage)\r
117         ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)\r
118         ON_BN_CLICKED(IDC_GETLOCKTOP, OnChange)\r
119         ON_EN_CHANGE(IDC_NOCONTEXTPATHS, &CSetLookAndFeelPage::OnEnChangeNocontextpaths)\r
120 END_MESSAGE_MAP()\r
121 \r
122 \r
123 BOOL CSetLookAndFeelPage::OnInitDialog()\r
124 {\r
125         ISettingsPropPage::OnInitDialog();\r
126 \r
127         m_tooltips.Create(this);\r
128         m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_MENULAYOUT_TT);\r
129         //m_tooltips.AddTool(IDC_GETLOCKTOP, IDS_SETTINGS_GETLOCKTOP_TT);\r
130         m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);\r
131 \r
132         m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);\r
133 \r
134         m_cMenuList.DeleteAllItems();\r
135         int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;\r
136         while (c>=0)\r
137                 m_cMenuList.DeleteColumn(c--);\r
138         m_cMenuList.InsertColumn(0, _T(""));\r
139 \r
140         CXPTheme theme;\r
141         theme.SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);\r
142 \r
143         m_cMenuList.SetRedraw(false);\r
144 \r
145         m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);\r
146 \r
147         m_bBlock = true;\r
148         \r
149         InsertMenuItemToList(&m_cMenuList,&m_imgList);\r
150         SetMenuItemCheck(&m_cMenuList,m_topmenu);\r
151 \r
152         m_bBlock = false;\r
153 \r
154         m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);\r
155         int mincol = 0;\r
156         int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;\r
157         int col;\r
158         for (col = mincol; col <= maxcol; col++)\r
159         {\r
160                 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);\r
161         }\r
162         m_cMenuList.SetRedraw(true);\r
163 \r
164         UpdateData(FALSE);\r
165 \r
166         return TRUE;\r
167 }\r
168 \r
169 BOOL CSetLookAndFeelPage::PreTranslateMessage(MSG* pMsg)\r
170 {\r
171         m_tooltips.RelayEvent(pMsg);\r
172         return ISettingsPropPage::PreTranslateMessage(pMsg);\r
173 }\r
174 \r
175 BOOL CSetLookAndFeelPage::OnApply()\r
176 {\r
177         UpdateData();\r
178 \r
179         m_regTopmenu = m_topmenu & 0xFFFFFFFF;\r
180         m_regTopmenuhigh = (m_topmenu >> 32);\r
181         \r
182         m_regTopmenu.getErrorString();\r
183         m_sNoContextPaths.Replace(_T("\r"), _T(""));\r
184         if (m_sNoContextPaths.Right(1).Compare(_T("\n"))!=0)\r
185                 m_sNoContextPaths += _T("\n");\r
186 \r
187         Store (m_sNoContextPaths, m_regNoContextPaths);\r
188 \r
189         SetModified(FALSE);\r
190         return ISettingsPropPage::OnApply();\r
191 }\r
192 \r
193 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)\r
194 {\r
195         if (m_bBlock)\r
196                 return;\r
197         SetModified(TRUE);\r
198         if (m_cMenuList.GetItemCount() > 0)\r
199         {\r
200                 m_topmenu = GetMenuListMask(&m_cMenuList);\r
201         }\r
202         *pResult = 0;\r
203 }\r
204 \r
205 void CSetLookAndFeelPage::OnChange()\r
206 {\r
207         SetModified();\r
208 }\r
209 \r
210 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()\r
211 {\r
212         SetModified();\r
213 }\r
214 \r
215 \r
216 \r
217 // Set Extmenu class\r
218 #include "SetExtMenu.h"\r
219 \r
220 IMPLEMENT_DYNAMIC(CSetExtMenu, ISettingsPropPage)\r
221 CSetExtMenu::CSetExtMenu()\r
222         : ISettingsPropPage(CSetExtMenu::IDD)\r
223 {\r
224         ShellCache shell;\r
225 \r
226         m_regExtmenu = shell.menuextlow;\r
227         m_regExtmenuhigh = shell.menuexthigh;\r
228 \r
229         m_extmenu = unsigned __int64(DWORD(m_regExtmenuhigh))<<32;\r
230         m_extmenu |= unsigned __int64(DWORD(m_regExtmenu));\r
231 \r
232 }\r
233 \r
234 CSetExtMenu::~CSetExtMenu()\r
235 {\r
236 }\r
237 \r
238 void CSetExtMenu::DoDataExchange(CDataExchange* pDX)\r
239 {\r
240         ISettingsPropPage::DoDataExchange(pDX);\r
241         DDX_Control(pDX, IDC_MENULIST, m_cMenuList);\r
242 }\r
243 \r
244 \r
245 BEGIN_MESSAGE_MAP(CSetExtMenu, ISettingsPropPage)\r
246         ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)\r
247         ON_BN_CLICKED(IDC_GETLOCKTOP, OnChange)\r
248 END_MESSAGE_MAP()\r
249 \r
250 \r
251 BOOL CSetExtMenu::OnInitDialog()\r
252 {\r
253         ISettingsPropPage::OnInitDialog();\r
254 \r
255         m_tooltips.Create(this);\r
256         m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_MENULAYOUT_TT);\r
257         //m_tooltips.AddTool(IDC_GETLOCKTOP, IDS_SETTINGS_GETLOCKTOP_TT);\r
258         //m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);\r
259 \r
260         m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);\r
261 \r
262         m_cMenuList.DeleteAllItems();\r
263         int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;\r
264         while (c>=0)\r
265                 m_cMenuList.DeleteColumn(c--);\r
266         m_cMenuList.InsertColumn(0, _T(""));\r
267 \r
268         CXPTheme theme;\r
269         theme.SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);\r
270 \r
271         m_cMenuList.SetRedraw(false);\r
272 \r
273         m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);\r
274 \r
275         m_bBlock = true;\r
276 \r
277         InsertMenuItemToList(&m_cMenuList,&m_imgList);\r
278         SetMenuItemCheck(&m_cMenuList,m_extmenu);\r
279 \r
280         m_bBlock = false;\r
281 \r
282         m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);\r
283         int mincol = 0;\r
284         int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;\r
285         int col;\r
286         for (col = mincol; col <= maxcol; col++)\r
287         {\r
288                 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);\r
289         }\r
290         m_cMenuList.SetRedraw(true);\r
291 \r
292         UpdateData(FALSE);\r
293 \r
294         return TRUE;\r
295 }\r
296 \r
297 BOOL CSetExtMenu::PreTranslateMessage(MSG* pMsg)\r
298 {\r
299         m_tooltips.RelayEvent(pMsg);\r
300         return ISettingsPropPage::PreTranslateMessage(pMsg);\r
301 }\r
302 \r
303 BOOL CSetExtMenu::OnApply()\r
304 {\r
305         UpdateData();\r
306 \r
307         m_regExtmenu = (DWORD)(m_extmenu & 0xFFFFFFFF);\r
308         m_regExtmenuhigh = (DWORD)(m_extmenu >> 32);\r
309 \r
310         SetModified(FALSE);\r
311         return ISettingsPropPage::OnApply();\r
312 }\r
313 \r
314 void CSetExtMenu::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)\r
315 {\r
316         if( m_bBlock )\r
317                 return;\r
318 \r
319         SetModified(TRUE);\r
320         if (m_cMenuList.GetItemCount() > 0)\r
321         {\r
322                 m_extmenu = GetMenuListMask(&m_cMenuList);\r
323         }\r
324         *pResult = 0;\r
325 }\r
326 \r
327 void CSetExtMenu::OnChange()\r
328 {\r
329         SetModified();\r
330 }\r