1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2006, 2008-2010 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "SysImageList.h"
23 // Singleton constructor and destructor (private)
25 CSysImageList
* CSysImageList::instance
= 0;
27 CSysImageList::CSysImageList()
30 TCHAR windir
[MAX_PATH
];
31 GetWindowsDirectory(windir
, _countof(windir
)); // MAX_PATH ok.
32 HIMAGELIST hSystemImageList
=
33 (HIMAGELIST
)SHGetFileInfo(
37 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
);
38 Attach(hSystemImageList
);
41 CSysImageList::~CSysImageList()
46 // Singleton specific operations
48 CSysImageList
& CSysImageList::GetInstance()
51 instance
= new CSysImageList
;
55 void CSysImageList::Cleanup()
63 int CSysImageList::AddIcon(const HICON hIcon
)
65 return this->Add(hIcon
);
68 int CSysImageList::GetDirIconIndex() const
70 return GetFileIcon(_T("Doesn't matter"), FILE_ATTRIBUTE_DIRECTORY
, 0);
73 int CSysImageList::GetDirOpenIconIndex() const
75 return GetFileIcon(_T("Doesn't matter"), FILE_ATTRIBUTE_DIRECTORY
, SHGFI_OPENICON
);
78 int CSysImageList::GetDefaultIconIndex() const
80 return GetFileIcon(_T(""), FILE_ATTRIBUTE_NORMAL
, 0);
83 int CSysImageList::GetFileIconIndex(const CString
& file
) const
85 return GetFileIcon(file
, FILE_ATTRIBUTE_NORMAL
, 0);
88 int CSysImageList::GetPathIconIndex(const CTGitPath
& filePath
) const
90 CString strExtension
= filePath
.GetFileExtension();
91 strExtension
.MakeUpper();
92 IconIndexMap::iterator it
= m_indexCache
.lower_bound(strExtension
);
93 if (it
== m_indexCache
.end() || strExtension
< it
->first
)
95 // We don't have this extension in the map
96 int iconIndex
= GetFileIconIndex(filePath
.GetFilename());
97 it
= m_indexCache
.insert(it
, std::make_pair(strExtension
, iconIndex
));
99 // We must have found it
103 int CSysImageList::GetFileIcon( LPCTSTR file
, DWORD attributes
, UINT extraFlags
) const
106 SecureZeroMemory(&sfi
, sizeof sfi
);
112 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
| SHGFI_USEFILEATTRIBUTES
| extraFlags
);