Replace all calls to LoadIcon and LoadImage with calls to LoadIconWithScaleDown
[TortoiseGit.git] / src / TortoiseProc / Settings / SetLookAndFeelPage.cpp
blobe0f2c134f2e450b8406e4c4ed71e7c440bfc7249
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2011-2016 - 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 "MenuInfo.h"
28 #include "ShellCache.h"
30 extern MenuInfo menuInfo[];
32 void InsertMenuItemToList(CListCtrl *list,CImageList *imagelist)
34 int i=0;
35 int iconWidth = GetSystemMetrics(SM_CXSMICON);
36 int iconHeight = GetSystemMetrics(SM_CYSMICON);
37 while(menuInfo[i].command != ShellMenuLastEntry)
39 if ((menuInfo[i].command != ShellSeparator &&
40 menuInfo[i].command != ShellSubMenu &&
41 menuInfo[i].command != ShellSubMenuFile &&
42 menuInfo[i].command != ShellSubMenuFolder &&
43 menuInfo[i].command != ShellSubMenuLink &&
44 menuInfo[i].command != ShellMenuMergeAbort &&
45 menuInfo[i].command != ShellSubMenuMultiple) &&
46 (i == 0 || menuInfo[i - 1].menuID != menuInfo[i].menuID))
48 auto hIcon = CAppUtils::LoadIconEx(menuInfo[i].iconID, iconWidth, iconHeight);
50 int nImage = imagelist -> Add(hIcon);
52 CString temp;
53 temp.LoadString(menuInfo[i].menuTextID);
54 CStringUtils::RemoveAccelerators(temp);
56 int nIndex = list->GetItemCount();
57 list->InsertItem(nIndex,temp,nImage);
58 list->SetItemData(nIndex,i);
60 i++;
64 void SetMenuItemCheck(CListCtrl *list, unsigned __int64 mask, CButton *selectAll)
66 bool allChecked = true;
67 for(int i=0;i<list->GetItemCount();i++)
69 int data = (int)list->GetItemData(i);
71 list->SetCheck(i,(menuInfo[data].menuID & mask) == menuInfo[data].menuID);
72 if (!((menuInfo[data].menuID & mask) == menuInfo[data].menuID))
73 allChecked = false;
76 if (!mask)
77 selectAll->SetCheck(BST_UNCHECKED);
78 else if (allChecked)
79 selectAll->SetCheck(BST_CHECKED);
80 else
81 selectAll->SetCheck(BST_INDETERMINATE);
84 unsigned __int64 GetMenuListMask(CListCtrl* list, CButton* selectAll = nullptr)
86 unsigned __int64 mask = 0;
87 bool allChecked = true;
89 for(int i=0;i<list->GetItemCount();i++)
91 if(list->GetCheck(i))
93 int data = (int)list->GetItemData(i);
94 mask |= menuInfo[data].menuID ;
96 else
97 allChecked = false;
99 if (!selectAll)
100 return mask;
102 if (!mask)
103 selectAll->SetCheck(BST_UNCHECKED);
104 else if (allChecked)
105 selectAll->SetCheck(BST_CHECKED);
106 else
107 selectAll->SetCheck(BST_INDETERMINATE);
108 return mask;
111 // Handles click on "select all" and returns the calculated mask
112 unsigned __int64 ClickedSelectAll(CListCtrl *list, CButton *selectAll)
114 UINT state = (selectAll->GetState() & 0x0003);
115 if (state == BST_INDETERMINATE)
117 // It is not at all useful to manually place the checkbox into the indeterminate state...
118 // We will force this on to the unchecked state
119 state = BST_UNCHECKED;
120 selectAll->SetCheck(state);
123 theApp.DoWaitCursor(1);
125 for (int i = 0; i < list->GetItemCount(); i++)
126 list->SetCheck(i, state == BST_CHECKED);
128 unsigned __int64 mask = GetMenuListMask(list);
130 theApp.DoWaitCursor(-1);
132 return mask;
135 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage, ISettingsPropPage)
136 CSetLookAndFeelPage::CSetLookAndFeelPage()
137 : ISettingsPropPage(CSetLookAndFeelPage::IDD)
138 , m_bBlock(false)
139 , m_bHideMenus(false)
141 ShellCache cache;
142 m_regTopmenu = cache.menulayoutlow;
143 m_regTopmenuhigh = cache.menulayouthigh;
145 m_topmenu = unsigned __int64(DWORD(m_regTopmenuhigh))<<32;
146 m_topmenu |= unsigned __int64(DWORD(m_regTopmenu));
148 m_regHideMenus = CRegDWORD(L"Software\\TortoiseGit\\HideMenusForUnversionedItems", FALSE);
149 m_bHideMenus = m_regHideMenus;
151 m_regNoContextPaths = CRegString(L"Software\\TortoiseGit\\NoContextPaths", L"");
152 m_sNoContextPaths = m_regNoContextPaths;
153 m_sNoContextPaths.Replace(L"\n", L"\r\n");
155 m_regEnableDragContextMenu = CRegDWORD(L"Software\\TortoiseGit\\EnableDragContextMenu", TRUE);
156 m_bEnableDragContextMenu = m_regEnableDragContextMenu;
159 CSetLookAndFeelPage::~CSetLookAndFeelPage()
163 void CSetLookAndFeelPage::DoDataExchange(CDataExchange* pDX)
165 ISettingsPropPage::DoDataExchange(pDX);
166 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
167 DDX_Check(pDX, IDC_HIDEMENUS, m_bHideMenus);
168 DDX_Text(pDX, IDC_NOCONTEXTPATHS, m_sNoContextPaths);
169 DDX_Check(pDX, IDC_ENABLEDRAGCONTEXTMENU, m_bEnableDragContextMenu);
173 BEGIN_MESSAGE_MAP(CSetLookAndFeelPage, ISettingsPropPage)
174 ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)
175 ON_BN_CLICKED(IDC_SELECTALL, OnBnClickedSelectall)
176 ON_BN_CLICKED(IDC_RESTORE, OnBnClickedRestoreDefaults)
177 ON_BN_CLICKED(IDC_HIDEMENUS, OnChange)
178 ON_EN_CHANGE(IDC_NOCONTEXTPATHS, &CSetLookAndFeelPage::OnEnChangeNocontextpaths)
179 ON_BN_CLICKED(IDC_ENABLEDRAGCONTEXTMENU, OnChange)
180 END_MESSAGE_MAP()
183 BOOL CSetLookAndFeelPage::OnInitDialog()
185 ISettingsPropPage::OnInitDialog();
187 AdjustControlSize(IDC_SELECTALL);
188 AdjustControlSize(IDC_HIDEMENUS);
189 AdjustControlSize(IDC_ENABLEDRAGCONTEXTMENU);
191 m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_MENULAYOUT_TT);
192 m_tooltips.AddTool(IDC_HIDEMENUS, IDS_SETTINGS_HIDEMENUS_TT);
193 m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);
194 m_tooltips.AddTool(IDC_ENABLEDRAGCONTEXTMENU, IDS_SETTINGS_ENABLEDRAGCONTEXTMENU_TT);
196 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | (CRegDWORD(L"Software\\TortoiseGit\\FullRowSelect", TRUE) ? LVS_EX_FULLROWSELECT : 0) | LVS_EX_DOUBLEBUFFER);
198 m_cMenuList.DeleteAllItems();
199 int c = m_cMenuList.GetHeaderCtrl()->GetItemCount() - 1;
200 while (c>=0)
201 m_cMenuList.DeleteColumn(c--);
202 m_cMenuList.InsertColumn(0, L"");
204 SetWindowTheme(m_hWnd, L"Explorer", nullptr);
206 m_cMenuList.SetRedraw(false);
208 int iconWidth = GetSystemMetrics(SM_CXSMICON);
209 int iconHeight = GetSystemMetrics(SM_CYSMICON);
210 m_imgList.Create(iconWidth, iconHeight, ILC_COLOR32 | 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 = m_cMenuList.GetHeaderCtrl()->GetItemCount() - 1;
222 int col;
223 for (col = mincol; col <= maxcol; col++)
224 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
225 m_cMenuList.SetRedraw(true);
227 UpdateData(FALSE);
229 return TRUE;
232 BOOL CSetLookAndFeelPage::OnApply()
234 UpdateData();
236 m_regTopmenu = m_topmenu & 0xFFFFFFFF;
237 m_regTopmenuhigh = (m_topmenu >> 32);
239 m_regTopmenu.getErrorString();
240 m_sNoContextPaths.Remove('\r');
241 if (!CStringUtils::EndsWith(m_sNoContextPaths, L'\n'))
242 m_sNoContextPaths += L'\n';
244 Store(m_bHideMenus, m_regHideMenus);
245 Store(m_sNoContextPaths, m_regNoContextPaths);
246 Store(m_bEnableDragContextMenu, m_regEnableDragContextMenu);
248 m_sNoContextPaths.Replace(L"\n", L"\r\n");
250 SetModified(FALSE);
251 return ISettingsPropPage::OnApply();
254 void CSetLookAndFeelPage::OnBnClickedRestoreDefaults()
256 SetModified(TRUE);
257 m_topmenu = DEFAULTMENUTOPENTRIES;
258 m_bBlock = true;
259 SetMenuItemCheck(&m_cMenuList, m_topmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
260 m_bBlock = false;
263 void CSetLookAndFeelPage::OnBnClickedSelectall()
265 if (m_bBlock)
266 return;
268 SetModified(TRUE);
269 m_bBlock = true;
270 m_topmenu = ClickedSelectAll(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
271 m_bBlock = false;
274 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
276 if (m_bBlock)
277 return;
278 SetModified(TRUE);
279 if (m_cMenuList.GetItemCount() > 0)
280 m_topmenu = GetMenuListMask(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
281 *pResult = 0;
284 void CSetLookAndFeelPage::OnChange()
286 SetModified();
289 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()
291 SetModified();
294 // Set Extmenu class
295 #include "SetExtMenu.h"
297 IMPLEMENT_DYNAMIC(CSetExtMenu, ISettingsPropPage)
298 CSetExtMenu::CSetExtMenu()
299 : ISettingsPropPage(CSetExtMenu::IDD)
301 ShellCache shell;
303 m_bBlock = false;
305 m_regExtmenu = shell.menuextlow;
306 m_regExtmenuhigh = shell.menuexthigh;
308 m_extmenu = unsigned __int64(DWORD(m_regExtmenuhigh))<<32;
309 m_extmenu |= unsigned __int64(DWORD(m_regExtmenu));
312 CSetExtMenu::~CSetExtMenu()
316 void CSetExtMenu::DoDataExchange(CDataExchange* pDX)
318 ISettingsPropPage::DoDataExchange(pDX);
319 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
322 BEGIN_MESSAGE_MAP(CSetExtMenu, ISettingsPropPage)
323 ON_NOTIFY(LVN_ITEMCHANGED, IDC_MENULIST, OnLvnItemchangedMenulist)
324 ON_BN_CLICKED(IDC_SELECTALL, OnBnClickedSelectall)
325 ON_BN_CLICKED(IDC_RESTORE, OnBnClickedRestoreDefaults)
326 END_MESSAGE_MAP()
328 BOOL CSetExtMenu::OnInitDialog()
330 ISettingsPropPage::OnInitDialog();
332 AdjustControlSize(IDC_SELECTALL);
334 m_tooltips.AddTool(IDC_MENULIST, IDS_SETTINGS_EXTMENULAYOUT_TT);
335 //m_tooltips.AddTool(IDC_NOCONTEXTPATHS, IDS_SETTINGS_EXCLUDECONTEXTLIST_TT);
337 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | (CRegDWORD(L"Software\\TortoiseGit\\FullRowSelect", TRUE) ? LVS_EX_FULLROWSELECT : 0) | LVS_EX_DOUBLEBUFFER);
339 m_cMenuList.DeleteAllItems();
340 int c = m_cMenuList.GetHeaderCtrl()->GetItemCount() - 1;
341 while (c>=0)
342 m_cMenuList.DeleteColumn(c--);
343 m_cMenuList.InsertColumn(0, L"");
345 SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", nullptr);
347 m_cMenuList.SetRedraw(false);
349 int iconWidth = GetSystemMetrics(SM_CXSMICON);
350 int iconHeight = GetSystemMetrics(SM_CYSMICON);
351 m_imgList.Create(iconWidth, iconHeight, ILC_COLOR32 | ILC_MASK, 4, 1);
353 m_bBlock = true;
355 InsertMenuItemToList(&m_cMenuList,&m_imgList);
356 SetMenuItemCheck(&m_cMenuList, m_extmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
358 m_bBlock = false;
360 m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);
361 int mincol = 0;
362 int maxcol = m_cMenuList.GetHeaderCtrl()->GetItemCount() - 1;
363 int col;
364 for (col = mincol; col <= maxcol; col++)
365 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
366 m_cMenuList.SetRedraw(true);
368 UpdateData(FALSE);
370 return TRUE;
373 BOOL CSetExtMenu::OnApply()
375 UpdateData();
377 m_regExtmenu = (DWORD)(m_extmenu & 0xFFFFFFFF);
378 m_regExtmenuhigh = (DWORD)(m_extmenu >> 32);
380 SetModified(FALSE);
381 return ISettingsPropPage::OnApply();
384 void CSetExtMenu::OnBnClickedRestoreDefaults()
386 SetModified(TRUE);
387 m_extmenu = DEFAULTMENUEXTENTRIES;
388 m_bBlock = true;
389 SetMenuItemCheck(&m_cMenuList, m_extmenu, (CButton*)GetDlgItem(IDC_SELECTALL));
390 m_bBlock = false;
393 void CSetExtMenu::OnBnClickedSelectall()
395 if (m_bBlock)
396 return;
398 SetModified(TRUE);
399 m_bBlock = true;
400 m_extmenu = ClickedSelectAll(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
401 m_bBlock = false;
404 void CSetExtMenu::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
406 if( m_bBlock )
407 return;
409 SetModified(TRUE);
410 if (m_cMenuList.GetItemCount() > 0)
411 m_extmenu = GetMenuListMask(&m_cMenuList, (CButton*)GetDlgItem(IDC_SELECTALL));
412 *pResult = 0;
415 void CSetExtMenu::OnChange()
417 SetModified();