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 "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
31 extern MenuInfo menuInfo[];
\r
33 void InsertMenuItemToList(CListCtrl *list,CImageList *imagelist)
\r
36 while(menuInfo[i].command != ShellMenuLastEntry)
\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
45 HICON hIcon = reinterpret_cast<HICON>(::LoadImage(AfxGetResourceHandle(),
\r
46 MAKEINTRESOURCE(menuInfo[i].iconID),IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT ));
\r
48 int nImage = imagelist -> Add(hIcon);
\r
51 temp.LoadString(menuInfo[i].menuTextID);
\r
52 CStringUtils::RemoveAccelerators(temp);
\r
54 int nIndex = list->GetItemCount();
\r
55 list->InsertItem(nIndex,temp,nImage);
\r
56 list->SetItemData(nIndex,i);
\r
62 void SetMenuItemCheck(CListCtrl *list, unsigned __int64 mask)
\r
64 for(int i=0;i<list->GetItemCount();i++)
\r
66 int data = list->GetItemData(i);
\r
68 list->SetCheck(i,(menuInfo[data].menuID & mask) == menuInfo[data].menuID);
\r
72 unsigned __int64 GetMenuListMask(CListCtrl *list)
\r
74 unsigned __int64 mask = 0;
\r
76 for(int i=0;i<list->GetItemCount();i++)
\r
78 if(list->GetCheck(i))
\r
80 int data = list->GetItemData(i);
\r
81 mask |= menuInfo[data].menuID ;
\r
87 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage, ISettingsPropPage)
\r
88 CSetLookAndFeelPage::CSetLookAndFeelPage()
\r
89 : ISettingsPropPage(CSetLookAndFeelPage::IDD)
\r
93 m_regTopmenu = cache.menulayoutlow;
\r
94 m_regTopmenuhigh = cache.menulayouthigh;
\r
96 m_topmenu = unsigned __int64(DWORD(m_regTopmenuhigh))<<32;
\r
97 m_topmenu |= unsigned __int64(DWORD(m_regTopmenu));
\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
104 CSetLookAndFeelPage::~CSetLookAndFeelPage()
\r
108 void CSetLookAndFeelPage::DoDataExchange(CDataExchange* pDX)
\r
110 ISettingsPropPage::DoDataExchange(pDX);
\r
111 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
\r
112 DDX_Text(pDX, IDC_NOCONTEXTPATHS, m_sNoContextPaths);
\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
123 BOOL CSetLookAndFeelPage::OnInitDialog()
\r
125 ISettingsPropPage::OnInitDialog();
\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
132 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
\r
134 m_cMenuList.DeleteAllItems();
\r
135 int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
\r
137 m_cMenuList.DeleteColumn(c--);
\r
138 m_cMenuList.InsertColumn(0, _T(""));
\r
141 theme.SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);
\r
143 m_cMenuList.SetRedraw(false);
\r
145 m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);
\r
149 InsertMenuItemToList(&m_cMenuList,&m_imgList);
\r
150 SetMenuItemCheck(&m_cMenuList,m_topmenu);
\r
154 m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);
\r
156 int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
\r
158 for (col = mincol; col <= maxcol; col++)
\r
160 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
\r
162 m_cMenuList.SetRedraw(true);
\r
169 BOOL CSetLookAndFeelPage::PreTranslateMessage(MSG* pMsg)
\r
171 m_tooltips.RelayEvent(pMsg);
\r
172 return ISettingsPropPage::PreTranslateMessage(pMsg);
\r
175 BOOL CSetLookAndFeelPage::OnApply()
\r
179 m_regTopmenu = m_topmenu & 0xFFFFFFFF;
\r
180 m_regTopmenuhigh = (m_topmenu >> 32);
\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
187 Store (m_sNoContextPaths, m_regNoContextPaths);
\r
189 SetModified(FALSE);
\r
190 return ISettingsPropPage::OnApply();
\r
193 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
\r
198 if (m_cMenuList.GetItemCount() > 0)
\r
200 m_topmenu = GetMenuListMask(&m_cMenuList);
\r
205 void CSetLookAndFeelPage::OnChange()
\r
210 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()
\r
217 // Set Extmenu class
\r
218 #include "SetExtMenu.h"
\r
220 IMPLEMENT_DYNAMIC(CSetExtMenu, ISettingsPropPage)
\r
221 CSetExtMenu::CSetExtMenu()
\r
222 : ISettingsPropPage(CSetExtMenu::IDD)
\r
226 m_regExtmenu = shell.menuextlow;
\r
227 m_regExtmenuhigh = shell.menuexthigh;
\r
229 m_extmenu = unsigned __int64(DWORD(m_regExtmenuhigh))<<32;
\r
230 m_extmenu |= unsigned __int64(DWORD(m_regExtmenu));
\r
234 CSetExtMenu::~CSetExtMenu()
\r
238 void CSetExtMenu::DoDataExchange(CDataExchange* pDX)
\r
240 ISettingsPropPage::DoDataExchange(pDX);
\r
241 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
\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
251 BOOL CSetExtMenu::OnInitDialog()
\r
253 ISettingsPropPage::OnInitDialog();
\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
260 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
\r
262 m_cMenuList.DeleteAllItems();
\r
263 int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
\r
265 m_cMenuList.DeleteColumn(c--);
\r
266 m_cMenuList.InsertColumn(0, _T(""));
\r
269 theme.SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);
\r
271 m_cMenuList.SetRedraw(false);
\r
273 m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);
\r
277 InsertMenuItemToList(&m_cMenuList,&m_imgList);
\r
278 SetMenuItemCheck(&m_cMenuList,m_extmenu);
\r
282 m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);
\r
284 int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
\r
286 for (col = mincol; col <= maxcol; col++)
\r
288 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
\r
290 m_cMenuList.SetRedraw(true);
\r
297 BOOL CSetExtMenu::PreTranslateMessage(MSG* pMsg)
\r
299 m_tooltips.RelayEvent(pMsg);
\r
300 return ISettingsPropPage::PreTranslateMessage(pMsg);
\r
303 BOOL CSetExtMenu::OnApply()
\r
307 m_regExtmenu = (DWORD)(m_extmenu & 0xFFFFFFFF);
\r
308 m_regExtmenuhigh = (DWORD)(m_extmenu >> 32);
\r
310 SetModified(FALSE);
\r
311 return ISettingsPropPage::OnApply();
\r
314 void CSetExtMenu::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
\r
320 if (m_cMenuList.GetItemCount() > 0)
\r
322 m_extmenu = GetMenuListMask(&m_cMenuList);
\r
327 void CSetExtMenu::OnChange()
\r