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.
21 #include "TortoiseProc.h"
23 #include "ShellUpdater.h"
25 #include "StringUtils.h"
26 #include "SetLookAndFeelPage.h"
27 #include "MessageBox.h"
29 #include "ShellCache.h"
31 extern MenuInfo menuInfo
[];
33 void InsertMenuItemToList(CListCtrl
*list
,CImageList
*imagelist
)
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
);
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
);
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
))
76 selectAll
->SetCheck(BST_UNCHECKED
);
78 selectAll
->SetCheck(BST_CHECKED
);
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
++)
92 int data
= (int)list
->GetItemData(i
);
93 mask
|= menuInfo
[data
].menuID
;
102 selectAll
->SetCheck(BST_UNCHECKED
);
104 selectAll
->SetCheck(BST_CHECKED
);
106 selectAll
->SetCheck(BST_INDETERMINATE
);
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);
136 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage
, ISettingsPropPage
)
137 CSetLookAndFeelPage::CSetLookAndFeelPage()
138 : ISettingsPropPage(CSetLookAndFeelPage::IDD
)
140 , m_bHideMenus(false)
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
)
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;
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);
214 InsertMenuItemToList(&m_cMenuList
,&m_imgList
);
215 SetMenuItemCheck(&m_cMenuList
, m_topmenu
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
219 m_cMenuList
.SetImageList(&m_imgList
, LVSIL_SMALL
);
221 int maxcol
= ((CHeaderCtrl
*)(m_cMenuList
.GetDlgItem(0)))->GetItemCount()-1;
223 for (col
= mincol
; col
<= maxcol
; col
++)
225 m_cMenuList
.SetColumnWidth(col
,LVSCW_AUTOSIZE_USEHEADER
);
227 m_cMenuList
.SetRedraw(true);
234 BOOL
CSetLookAndFeelPage::PreTranslateMessage(MSG
* pMsg
)
236 m_tooltips
.RelayEvent(pMsg
);
237 return ISettingsPropPage::PreTranslateMessage(pMsg
);
240 BOOL
CSetLookAndFeelPage::OnApply()
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"));
259 return ISettingsPropPage::OnApply();
262 void CSetLookAndFeelPage::OnBnClickedRestoreDefaults()
265 m_topmenu
= DEFAULTMENUTOPENTRIES
;
267 SetMenuItemCheck(&m_cMenuList
, m_topmenu
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
271 void CSetLookAndFeelPage::OnBnClickedSelectall()
278 m_topmenu
= ClickedSelectAll(&m_cMenuList
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
282 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR
* /*pNMHDR*/, LRESULT
*pResult
)
287 if (m_cMenuList
.GetItemCount() > 0)
289 m_topmenu
= GetMenuListMask(&m_cMenuList
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
294 void CSetLookAndFeelPage::OnChange()
299 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()
307 #include "SetExtMenu.h"
309 IMPLEMENT_DYNAMIC(CSetExtMenu
, ISettingsPropPage
)
310 CSetExtMenu::CSetExtMenu()
311 : ISettingsPropPage(CSetExtMenu::IDD
)
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
)
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;
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);
369 InsertMenuItemToList(&m_cMenuList
,&m_imgList
);
370 SetMenuItemCheck(&m_cMenuList
, m_extmenu
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
374 m_cMenuList
.SetImageList(&m_imgList
, LVSIL_SMALL
);
376 int maxcol
= ((CHeaderCtrl
*)(m_cMenuList
.GetDlgItem(0)))->GetItemCount()-1;
378 for (col
= mincol
; col
<= maxcol
; col
++)
380 m_cMenuList
.SetColumnWidth(col
,LVSCW_AUTOSIZE_USEHEADER
);
382 m_cMenuList
.SetRedraw(true);
389 BOOL
CSetExtMenu::PreTranslateMessage(MSG
* pMsg
)
391 m_tooltips
.RelayEvent(pMsg
);
392 return ISettingsPropPage::PreTranslateMessage(pMsg
);
395 BOOL
CSetExtMenu::OnApply()
399 m_regExtmenu
= (DWORD
)(m_extmenu
& 0xFFFFFFFF);
400 m_regExtmenuhigh
= (DWORD
)(m_extmenu
>> 32);
403 return ISettingsPropPage::OnApply();
406 void CSetExtMenu::OnBnClickedRestoreDefaults()
409 m_extmenu
= DEFAULTMENUEXTENTRIES
;
411 SetMenuItemCheck(&m_cMenuList
, m_extmenu
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
415 void CSetExtMenu::OnBnClickedSelectall()
422 m_extmenu
= ClickedSelectAll(&m_cMenuList
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
426 void CSetExtMenu::OnLvnItemchangedMenulist(NMHDR
* /*pNMHDR*/, LRESULT
*pResult
)
432 if (m_cMenuList
.GetItemCount() > 0)
434 m_extmenu
= GetMenuListMask(&m_cMenuList
, (CButton
*)GetDlgItem(IDC_SELECTALL
));
439 void CSetExtMenu::OnChange()