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
30 extern MenuInfo menuInfo[];
\r
32 void InsertMenuItemToList(CListCtrl *list,CImageList *imagelist)
\r
35 while(menuInfo[i].command != ShellMenuLastEntry)
\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
44 HICON hIcon = reinterpret_cast<HICON>(::LoadImage(AfxGetResourceHandle(),
\r
45 MAKEINTRESOURCE(menuInfo[i].iconID),IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT ));
\r
47 int nImage = imagelist -> Add(hIcon);
\r
50 temp.LoadString(menuInfo[i].menuTextID);
\r
51 CStringUtils::RemoveAccelerators(temp);
\r
53 int nIndex = list->GetItemCount();
\r
54 list->InsertItem(nIndex,temp,nImage);
\r
55 list->SetItemData(nIndex,i);
\r
61 void SetMenuItemCheck(CListCtrl *list, unsigned __int64 mask)
\r
63 for(int i=0;i<list->GetItemCount();i++)
\r
65 int data = list->GetItemData(i);
\r
67 list->SetCheck(i,(menuInfo[data].menuID & mask) == menuInfo[data].menuID);
\r
71 unsigned __int64 GetMenuListMask(CListCtrl *list)
\r
73 unsigned __int64 mask = 0;
\r
75 for(int i=0;i<list->GetItemCount();i++)
\r
77 if(list->GetCheck(i))
\r
79 int data = list->GetItemData(i);
\r
80 mask |= menuInfo[data].menuID ;
\r
86 IMPLEMENT_DYNAMIC(CSetLookAndFeelPage, ISettingsPropPage)
\r
87 CSetLookAndFeelPage::CSetLookAndFeelPage()
\r
88 : ISettingsPropPage(CSetLookAndFeelPage::IDD)
\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
94 m_topmenu = unsigned __int64(DWORD(m_regTopmenuhigh))<<32;
\r
95 m_topmenu |= unsigned __int64(DWORD(m_regTopmenu));
\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
102 CSetLookAndFeelPage::~CSetLookAndFeelPage()
\r
106 void CSetLookAndFeelPage::DoDataExchange(CDataExchange* pDX)
\r
108 ISettingsPropPage::DoDataExchange(pDX);
\r
109 DDX_Control(pDX, IDC_MENULIST, m_cMenuList);
\r
110 DDX_Text(pDX, IDC_NOCONTEXTPATHS, m_sNoContextPaths);
\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
121 BOOL CSetLookAndFeelPage::OnInitDialog()
\r
123 ISettingsPropPage::OnInitDialog();
\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
130 m_cMenuList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
\r
132 m_cMenuList.DeleteAllItems();
\r
133 int c = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
\r
135 m_cMenuList.DeleteColumn(c--);
\r
136 m_cMenuList.InsertColumn(0, _T(""));
\r
139 theme.SetWindowTheme(m_cMenuList.GetSafeHwnd(), L"Explorer", NULL);
\r
141 m_cMenuList.SetRedraw(false);
\r
143 m_imgList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 4, 1);
\r
147 InsertMenuItemToList(&m_cMenuList,&m_imgList);
\r
148 SetMenuItemCheck(&m_cMenuList,m_topmenu);
\r
152 m_cMenuList.SetImageList(&m_imgList, LVSIL_SMALL);
\r
154 int maxcol = ((CHeaderCtrl*)(m_cMenuList.GetDlgItem(0)))->GetItemCount()-1;
\r
156 for (col = mincol; col <= maxcol; col++)
\r
158 m_cMenuList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
\r
160 m_cMenuList.SetRedraw(true);
\r
167 BOOL CSetLookAndFeelPage::PreTranslateMessage(MSG* pMsg)
\r
169 m_tooltips.RelayEvent(pMsg);
\r
170 return ISettingsPropPage::PreTranslateMessage(pMsg);
\r
173 BOOL CSetLookAndFeelPage::OnApply()
\r
176 Store ((DWORD)(m_topmenu & 0xFFFFFFFF), m_regTopmenu);
\r
177 Store ((DWORD)(m_topmenu >> 32), m_regTopmenuhigh);
\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
183 Store (m_sNoContextPaths, m_regNoContextPaths);
\r
185 SetModified(FALSE);
\r
186 return ISettingsPropPage::OnApply();
\r
189 void CSetLookAndFeelPage::InsertItem(UINT nTextID, UINT nIconID, unsigned __int64 dwFlags)
\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
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
203 void CSetLookAndFeelPage::OnLvnItemchangedMenulist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
\r
208 if (m_cMenuList.GetItemCount() > 0)
\r
210 m_topmenu = GetMenuListMask(&m_cMenuList);
\r
215 void CSetLookAndFeelPage::OnChange()
\r
220 void CSetLookAndFeelPage::OnEnChangeNocontextpaths()
\r