Minor cleanup
[TortoiseGit.git] / src / TortoiseProc / Settings / SetLookAndFeelPage.cpp
blobdf4b8d12c4f62a1b53dbea3deb25b01d2c372080
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2011-2014 - TortoiseGit
4 // Copyright (C) 2003-2008, 2011, 2014 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "TortoiseProc.h"
22 #include "Globals.h"
23 #include "ShellUpdater.h"
24 #include "AppUtils.h"
25 #include "StringUtils.h"
26 #include "SetLookAndFeelPage.h"
27 #include "MessageBox.h"
28 #include "MenuInfo.h"
29 #include "ShellCache.h"
31 extern MenuInfo menuInfo[];
33 void InsertMenuItemToList(CListCtrl *list,CImageList *imagelist)
35 int i=0;
36 while(menuInfo[i].command != ShellMenuLastEntry)
38 if ((menuInfo[i].command != ShellSeparator &&
39 menuInfo[i].command != ShellSubMenu &&
40 menuInfo[i].command != ShellSubMenuFile &&
41 menuInfo[i].command != ShellSubMenuFolder &&
42 menuInfo[i].command != ShellSubMenuLink &&
43 menuInfo[i].command != ShellSubMenuMultiple) &&
44 (i == 0 || menuInfo[i - 1].menuID != menuInfo[i].menuID))
46 HICON hIcon = reinterpret_cast<HICON>(::LoadImage(AfxGetResourceHandle(),
47 MAKEINTRESOURCE(menuInfo[i].iconID),IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT ));
49 int nImage = imagelist -> Add(hIcon);
51 CString temp;
52 temp.LoadString(menuInfo[i].menuTextID);
53 CStringUtils::RemoveAccelerators(temp);
55 int nIndex = list->GetItemCount();
56 list->InsertItem(nIndex,temp,nImage);
57 list->SetItemData(nIndex,i);
59 i++;
63 void SetMenuItemCheck(CListCtrl *list, unsigned __int64 mask, CButton *selectAll)
65 bool allChecked = true;
66 for(int i=0;i<list->GetItemCount();i++)
68 int data = (int)list->GetItemData(i);
70 list->SetCheck(i,(menuInfo[data].menuID & mask) == menuInfo[data].menuID);
71 if (!((menuInfo[data].menuID & mask) == menuInfo[data].menuID))
72 allChecked = false;
75 if (!mask)
76 selectAll->SetCheck(BST_UNCHECKED);
77 else if (allChecked)
78 selectAll->SetCheck(BST_CHECKED);
79 else
80 selectAll->SetCheck(BST_INDETERMINATE);
83 unsigned __int64 GetMenuListMask(CListCtrl *list, CButton *selectAll = NULL)
85 unsigned __int64 mask = 0;
86 bool allChecked = true;
88 for(int i=0;i<list->GetItemCount();i++)
90 if(list->GetCheck(i))
92 int data = (int)list->GetItemData(i);
93 mask |= menuInfo[data].menuID ;
95 else
96 allChecked = false;
98 if (!selectAll)
99 return mask;
101 if (!mask)
102 selectAll->SetCheck(BST_UNCHECKED);
103 else if (allChecked)
104 selectAll->SetCheck(BST_CHECKED);
105 else
106 selectAll->SetCheck(BST_INDETERMINATE);
107 return mask;
110 // Handles click on "select all" and returns the calculated mask
111 unsigned __int64 ClickedSelectAll(CListCtrl *list, CButton *selectAll)
113 UINT state = (selectAll->GetState() & 0x0003);
114 if (state == BST_INDETERMINATE)
116 // It is not at all useful to manually place the checkbox into the indeterminate state...
117 // We will force this on to the unchecked state
118 state = BST_UNCHECKED;
119 selectAll->SetCheck(state);
122 theApp.DoWaitCursor(1);
124 for (int i = 0; i < list->GetItemCount(); i++)
126 list->SetCheck(i, state == BST_CHECKED);
129 unsigned __int64 mask = GetMenuListMask(list);
131 theApp.DoWaitCursor(-1);
133 return mask;
136 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage, ISettingsPropPage)
137 CSetLookAndFeelPage::CSetLookAndFeelPage()
138 : ISettingsPropPage(CSetLookAndFeelPage::IDD)
139 , m_bBlock(false)
140 , m_bHideMenus(false)
142 ShellCache cache;
143 m_regTopmenu = cache.menulayoutlow;
144 m_regTopmenuhigh = cache.menulayouthigh;
146 m_topmenu = unsigned __int64(DWORD(m_regTopmenuhigh))<<32;
147 m_topmenu |= unsigned __int64(DWORD(m_regTopmenu));
149 m_regHideMenus = CRegDWORD(_T("Software\\TortoiseGit\\HideMenusForUnversionedItems"), FALSE);
150 m_bHideMenus = m_regHideMenus;
152 m_regNoContextPaths = CRegString(_T("Software\\TortoiseGit\\NoContextPaths"), _T(""));
153 m_sNoContextPaths = m_regNoContextPaths;
154 m_sNoContextPaths.Replace(_T("\n"), _T("\r\n"));
156 m_regEnableDragContextMenu = CRegDWORD(_T("Software\\TortoiseGit\\EnableDragContextMenu"), TRUE);
157 m_bEnableDragContextMenu = m_regEnableDragContextMenu;
160 CSetLookAndFeelPage::~CSetLookAndFeelPage()
164 void CSetLookAndFeelPage::DoDataExchange(CDataExchange* pDX)
166 ISettingsPropPage::DoDataExchange(pDX);
167 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
168 DDX_Check(pDX, IDC_HIDEMENUS, m_bHideMenus);
169 DDX_Text(pDX, IDC_NOCONTEXTPATHS, m_sNoContextPaths);
170 DDX_Check(pDX, IDC_ENABLEDRAGCONTEXTMENU, m_bEnableDragContextMenu);
174 BEGIN_MESSAGE_MAP(CSetLookAndFeelPage, ISettingsPropPage)
175 ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)
176 ON_BN_CLICKED(IDC_SELECTALL, OnBnClickedSelectall)
177 ON_BN_CLICKED(IDC_RESTORE, OnBnClickedRestoreDefaults)
178 ON_BN_CLICKED(IDC_HIDEMENUS, OnChange)
179 ON_EN_CHANGE(IDC_NOCONTEXTPATHS, &CSetLookAndFeelPage::OnEnChangeNocontextpaths)
180 ON_BN_CLICKED(IDC_ENABLEDRAGCONTEXTMENU, OnChange)
181 END_MESSAGE_MAP()
184 BOOL CSetLookAndFeelPage::OnInitDialog()
186 ISettingsPropPage::OnInitDialog();
188 AdjustControlSize(IDC_SELECTALL);
189 AdjustControlSize(IDC_HIDEMENUS);
190 AdjustControlSize(IDC_ENABLEDRAGCONTEXTMENU);
192 m_tooltips.Create(this);
193 m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_MENULAYOUT_TT);
194 m_tooltips.AddTool(IDC_HIDEMENUS, IDS_SETTINGS_HIDEMENUS_TT);
195 m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);
196 m_tooltips.AddTool(IDC_ENABLEDRAGCONTEXTMENU, IDS_SETTINGS_ENABLEDRAGCONTEXTMENU_TT);
198 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
200 m_cMenuList.DeleteAllItems();
201 int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
202 while (c>=0)
203 m_cMenuList.DeleteColumn(c--);
204 m_cMenuList.InsertColumn(0, _T(""));
206 SetWindowTheme(m_hWnd, L"Explorer", NULL);
208 m_cMenuList.SetRedraw(false);
210 m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);
212 m_bBlock = true;
214 InsertMenuItemToList(&m_cMenuList,&m_imgList);
215 SetMenuItemCheck(&m_cMenuList, m_topmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
217 m_bBlock = false;
219 m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);
220 int mincol = 0;
221 int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
222 int col;
223 for (col = mincol; col <= maxcol; col++)
225 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
227 m_cMenuList.SetRedraw(true);
229 UpdateData(FALSE);
231 return TRUE;
234 BOOL CSetLookAndFeelPage::PreTranslateMessage(MSG* pMsg)
236 m_tooltips.RelayEvent(pMsg);
237 return ISettingsPropPage::PreTranslateMessage(pMsg);
240 BOOL CSetLookAndFeelPage::OnApply()
242 UpdateData();
244 m_regTopmenu = m_topmenu & 0xFFFFFFFF;
245 m_regTopmenuhigh = (m_topmenu >> 32);
247 m_regTopmenu.getErrorString();
248 m_sNoContextPaths.Remove('\r');
249 if (m_sNoContextPaths.Right(1).Compare(_T("\n"))!=0)
250 m_sNoContextPaths += _T("\n");
252 Store(m_bHideMenus, m_regHideMenus);
253 Store(m_sNoContextPaths, m_regNoContextPaths);
254 Store(m_bEnableDragContextMenu, m_regEnableDragContextMenu);
256 m_sNoContextPaths.Replace(_T("\n"), _T("\r\n"));
258 SetModified(FALSE);
259 return ISettingsPropPage::OnApply();
262 void CSetLookAndFeelPage::OnBnClickedRestoreDefaults()
264 SetModified(TRUE);
265 m_topmenu = DEFAULTMENUTOPENTRIES;
266 m_bBlock = true;
267 SetMenuItemCheck(&m_cMenuList, m_topmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
268 m_bBlock = false;
271 void CSetLookAndFeelPage::OnBnClickedSelectall()
273 if (m_bBlock)
274 return;
276 SetModified(TRUE);
277 m_bBlock = true;
278 m_topmenu = ClickedSelectAll(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
279 m_bBlock = false;
282 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
284 if (m_bBlock)
285 return;
286 SetModified(TRUE);
287 if (m_cMenuList.GetItemCount() > 0)
289 m_topmenu = GetMenuListMask(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
291 *pResult = 0;
294 void CSetLookAndFeelPage::OnChange()
296 SetModified();
299 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()
301 SetModified();
306 // Set Extmenu class
307 #include "SetExtMenu.h"
309 IMPLEMENT_DYNAMIC(CSetExtMenu, ISettingsPropPage)
310 CSetExtMenu::CSetExtMenu()
311 : ISettingsPropPage(CSetExtMenu::IDD)
313 ShellCache shell;
315 m_bBlock = false;
317 m_regExtmenu = shell.menuextlow;
318 m_regExtmenuhigh = shell.menuexthigh;
320 m_extmenu = unsigned __int64(DWORD(m_regExtmenuhigh))<<32;
321 m_extmenu |= unsigned __int64(DWORD(m_regExtmenu));
325 CSetExtMenu::~CSetExtMenu()
329 void CSetExtMenu::DoDataExchange(CDataExchange* pDX)
331 ISettingsPropPage::DoDataExchange(pDX);
332 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
336 BEGIN_MESSAGE_MAP(CSetExtMenu, ISettingsPropPage)
337 ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)
338 ON_BN_CLICKED(IDC_SELECTALL, OnBnClickedSelectall)
339 ON_BN_CLICKED(IDC_RESTORE, OnBnClickedRestoreDefaults)
340 END_MESSAGE_MAP()
343 BOOL CSetExtMenu::OnInitDialog()
345 ISettingsPropPage::OnInitDialog();
347 AdjustControlSize(IDC_SELECTALL);
349 m_tooltips.Create(this);
350 m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_EXTMENULAYOUT_TT);
351 //m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);
353 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
355 m_cMenuList.DeleteAllItems();
356 int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
357 while (c>=0)
358 m_cMenuList.DeleteColumn(c--);
359 m_cMenuList.InsertColumn(0, _T(""));
361 SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);
363 m_cMenuList.SetRedraw(false);
365 m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);
367 m_bBlock = true;
369 InsertMenuItemToList(&m_cMenuList,&m_imgList);
370 SetMenuItemCheck(&m_cMenuList, m_extmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
372 m_bBlock = false;
374 m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);
375 int mincol = 0;
376 int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
377 int col;
378 for (col = mincol; col <= maxcol; col++)
380 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
382 m_cMenuList.SetRedraw(true);
384 UpdateData(FALSE);
386 return TRUE;
389 BOOL CSetExtMenu::PreTranslateMessage(MSG* pMsg)
391 m_tooltips.RelayEvent(pMsg);
392 return ISettingsPropPage::PreTranslateMessage(pMsg);
395 BOOL CSetExtMenu::OnApply()
397 UpdateData();
399 m_regExtmenu = (DWORD)(m_extmenu & 0xFFFFFFFF);
400 m_regExtmenuhigh = (DWORD)(m_extmenu >> 32);
402 SetModified(FALSE);
403 return ISettingsPropPage::OnApply();
406 void CSetExtMenu::OnBnClickedRestoreDefaults()
408 SetModified(TRUE);
409 m_extmenu = DEFAULTMENUEXTENTRIES;
410 m_bBlock = true;
411 SetMenuItemCheck(&m_cMenuList, m_extmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
412 m_bBlock = false;
415 void CSetExtMenu::OnBnClickedSelectall()
417 if (m_bBlock)
418 return;
420 SetModified(TRUE);
421 m_bBlock = true;
422 m_extmenu = ClickedSelectAll(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
423 m_bBlock = false;
426 void CSetExtMenu::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
428 if( m_bBlock )
429 return;
431 SetModified(TRUE);
432 if (m_cMenuList.GetItemCount() > 0)
434 m_extmenu = GetMenuListMask(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
436 *pResult = 0;
439 void CSetExtMenu::OnChange()
441 SetModified();