OSDN Git Service

Use menuinfo to at setting connext menu page
[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 \r
30 extern MenuInfo menuInfo[];\r
31 \r
32 void InsertMenuItemToList(CListCtrl *list,CImageList *imagelist)\r
33 {\r
34         int i=0;\r
35         while(menuInfo[i].command != ShellMenuLastEntry)\r
36         {\r
37                 if(menuInfo[i].command != ShellSeparator &&\r
38                    menuInfo[i].command != ShellSubMenu &&\r
39                    menuInfo[i].command != ShellSubMenuFile &&\r
40                    menuInfo[i].command != ShellSubMenuFolder &&\r
41                    menuInfo[i].command != ShellSubMenuLink &&\r
42                    menuInfo[i].command != ShellSubMenuMultiple)\r
43                 {\r
44                         HICON hIcon = reinterpret_cast<HICON>(::LoadImage(AfxGetResourceHandle(),\r
45                                         MAKEINTRESOURCE(menuInfo[i].iconID),IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT ));\r
46 \r
47                         int nImage = imagelist -> Add(hIcon);\r
48 \r
49                         CString temp;\r
50                         temp.LoadString(menuInfo[i].menuTextID);\r
51                         CStringUtils::RemoveAccelerators(temp);\r
52                 \r
53                         int nIndex = list->GetItemCount();\r
54                         list->InsertItem(nIndex,temp,nImage);\r
55                         list->SetItemData(nIndex,i);\r
56                 }\r
57                 i++;\r
58         }\r
59 }\r
60 \r
61 void SetMenuItemCheck(CListCtrl *list, unsigned __int64 mask)\r
62 {\r
63         for(int i=0;i<list->GetItemCount();i++)\r
64         {\r
65                 int data = list->GetItemData(i);\r
66                 \r
67                 list->SetCheck(i,(menuInfo[data].menuID & mask) == menuInfo[data].menuID);\r
68         }\r
69 }\r
70 \r
71 unsigned __int64 GetMenuListMask(CListCtrl *list)\r
72 {\r
73         unsigned __int64 mask = 0;\r
74 \r
75         for(int i=0;i<list->GetItemCount();i++)\r
76         {               \r
77                 if(list->GetCheck(i))\r
78                 {\r
79                         int data = list->GetItemData(i);\r
80                         mask |= menuInfo[data].menuID ;\r
81                 }\r
82         }\r
83         return mask;\r
84 }\r
85 \r
86 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage, ISettingsPropPage)\r
87 CSetLookAndFeelPage::CSetLookAndFeelPage()\r
88         : ISettingsPropPage(CSetLookAndFeelPage::IDD)\r
89         , m_bBlock(false)\r
90 {\r
91         m_regTopmenu = CRegDWORD(_T("Software\\TortoiseGit\\ContextMenuEntries"), MENUSYNC|MENUCREATEREPOS|MENUCLONE|MENUCOMMIT);\r
92         m_regTopmenuhigh = CRegDWORD(_T("Software\\TortoiseGit\\ContextMenuEntrieshigh"), (MENUSYNC|MENUCREATEREPOS|MENUCLONE|MENUCOMMIT)>>32);\r
93 \r
94         m_topmenu = unsigned __int64(DWORD(m_regTopmenuhigh))<<32;\r
95         m_topmenu |= unsigned __int64(DWORD(m_regTopmenu));\r
96 \r
97         m_regNoContextPaths = CRegString(_T("Software\\TortoiseGit\\NoContextPaths"), _T(""));\r
98         m_sNoContextPaths = m_regNoContextPaths;\r
99         m_sNoContextPaths.Replace(_T("\n"), _T("\r\n"));\r
100 }\r
101 \r
102 CSetLookAndFeelPage::~CSetLookAndFeelPage()\r
103 {\r
104 }\r
105 \r
106 void CSetLookAndFeelPage::DoDataExchange(CDataExchange* pDX)\r
107 {\r
108         ISettingsPropPage::DoDataExchange(pDX);\r
109         DDX_Control(pDX, IDC_MENULIST, m_cMenuList);\r
110         DDX_Text(pDX, IDC_NOCONTEXTPATHS, m_sNoContextPaths);\r
111 }\r
112 \r
113 \r
114 BEGIN_MESSAGE_MAP(CSetLookAndFeelPage, ISettingsPropPage)\r
115         ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)\r
116         ON_BN_CLICKED(IDC_GETLOCKTOP, OnChange)\r
117         ON_EN_CHANGE(IDC_NOCONTEXTPATHS, &CSetLookAndFeelPage::OnEnChangeNocontextpaths)\r
118 END_MESSAGE_MAP()\r
119 \r
120 \r
121 BOOL CSetLookAndFeelPage::OnInitDialog()\r
122 {\r
123         ISettingsPropPage::OnInitDialog();\r
124 \r
125         m_tooltips.Create(this);\r
126         m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_MENULAYOUT_TT);\r
127         //m_tooltips.AddTool(IDC_GETLOCKTOP, IDS_SETTINGS_GETLOCKTOP_TT);\r
128         m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);\r
129 \r
130         m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);\r
131 \r
132         m_cMenuList.DeleteAllItems();\r
133         int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;\r
134         while (c>=0)\r
135                 m_cMenuList.DeleteColumn(c--);\r
136         m_cMenuList.InsertColumn(0, _T(""));\r
137 \r
138         CXPTheme theme;\r
139         theme.SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);\r
140 \r
141         m_cMenuList.SetRedraw(false);\r
142 \r
143         m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);\r
144 \r
145         m_bBlock = true;\r
146         \r
147         InsertMenuItemToList(&m_cMenuList,&m_imgList);\r
148         SetMenuItemCheck(&m_cMenuList,m_topmenu);\r
149 \r
150         m_bBlock = false;\r
151 \r
152         m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);\r
153         int mincol = 0;\r
154         int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;\r
155         int col;\r
156         for (col = mincol; col <= maxcol; col++)\r
157         {\r
158                 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);\r
159         }\r
160         m_cMenuList.SetRedraw(true);\r
161 \r
162         UpdateData(FALSE);\r
163 \r
164         return TRUE;\r
165 }\r
166 \r
167 BOOL CSetLookAndFeelPage::PreTranslateMessage(MSG* pMsg)\r
168 {\r
169         m_tooltips.RelayEvent(pMsg);\r
170         return ISettingsPropPage::PreTranslateMessage(pMsg);\r
171 }\r
172 \r
173 BOOL CSetLookAndFeelPage::OnApply()\r
174 {\r
175         UpdateData();\r
176     Store ((DWORD)(m_topmenu & 0xFFFFFFFF),     m_regTopmenu);\r
177     Store ((DWORD)(m_topmenu >> 32), m_regTopmenuhigh);\r
178 \r
179         m_sNoContextPaths.Replace(_T("\r"), _T(""));\r
180         if (m_sNoContextPaths.Right(1).Compare(_T("\n"))!=0)\r
181                 m_sNoContextPaths += _T("\n");\r
182 \r
183         Store (m_sNoContextPaths, m_regNoContextPaths);\r
184 \r
185         SetModified(FALSE);\r
186         return ISettingsPropPage::OnApply();\r
187 }\r
188 \r
189 void CSetLookAndFeelPage::InsertItem(UINT nTextID, UINT nIconID, unsigned __int64 dwFlags)\r
190 {\r
191         HICON hIcon = reinterpret_cast<HICON>(::LoadImage(AfxGetResourceHandle(),\r
192                 MAKEINTRESOURCE(nIconID),\r
193                 IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT ));\r
194         int nImage = m_imgList.Add(hIcon);\r
195         CString temp;\r
196         temp.LoadString(nTextID);\r
197         CStringUtils::RemoveAccelerators(temp);\r
198         int nIndex = m_cMenuList.GetItemCount();\r
199         m_cMenuList.InsertItem(nIndex, temp, nImage);\r
200         m_cMenuList.SetCheck(nIndex, !!(m_topmenu & dwFlags));\r
201 }\r
202 \r
203 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)\r
204 {\r
205         if (m_bBlock)\r
206                 return;\r
207         SetModified(TRUE);\r
208         if (m_cMenuList.GetItemCount() > 0)\r
209         {\r
210                 m_topmenu = GetMenuListMask(&m_cMenuList);\r
211         }\r
212         *pResult = 0;\r
213 }\r
214 \r
215 void CSetLookAndFeelPage::OnChange()\r
216 {\r
217         SetModified();\r
218 }\r
219 \r
220 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()\r
221 {\r
222         SetModified();\r
223 }\r
224 \r