443 lines
13 KiB
C++
443 lines
13 KiB
C++
#include "stdinc.h"
|
|
#include "ccomctl32.h"
|
|
#include "windows.h"
|
|
#include <stdio.h>
|
|
#include "FusionTrace.h"
|
|
|
|
#define FUSION_APPWEEK_UIVIEWER_DISPLAY_FILE_INFO 0
|
|
static FILETYPEVIAFILEEXT MatchTable_FileTypeViaFileExt[]=
|
|
{
|
|
{ L".cpp", L"C++ Source File"}, // index 0
|
|
{ L".c", L"C Source File"}, // index 1
|
|
{ L".h", L"C Header File"}, // index 2
|
|
{ L".def", L"DEF File"}, // index 3
|
|
{ L".err", L"ERR File"}, // index 4
|
|
{ L".ico", L"Icon"}, // index 5
|
|
{ L".inc", L"INC File"}, // index 6
|
|
{ L".rc", L"Resource Template"}, // index 7
|
|
{ L".log", L"Text Document"} // index 8
|
|
};
|
|
|
|
static ATL::CComModule Module;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(__uuidof(CSxApwComctl32View), CSxApwComctl32View)
|
|
END_OBJECT_MAP()
|
|
|
|
ATL::CComModule* GetModule() { return &Module; }
|
|
ATL::_ATL_OBJMAP_ENTRY* GetObjectMap() { return ObjectMap; }
|
|
const CLSID* GetTypeLibraryId() { return NULL; }
|
|
const HINSTANCE GetInstance() { return GetModule()->GetModuleInstance(); }
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::ResizeListViewCW(
|
|
ATL::CWindow listview,
|
|
ATL::CWindow parent)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
RECT rc;
|
|
IFFALSE_WIN32TOHR_EXIT(hr, parent.GetClientRect(&rc));
|
|
|
|
IFFALSE_WIN32TOHR_EXIT(hr, listview.MoveWindow(
|
|
rc.left,
|
|
rc.top,
|
|
rc.right - rc.left,
|
|
rc.bottom - rc.top,
|
|
TRUE));
|
|
hr = S_OK;
|
|
|
|
Exit:
|
|
return hr;
|
|
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::ResizeListView(
|
|
HWND hwndListView,
|
|
HWND hwndParent)
|
|
{
|
|
ATL::CWindow parent(hwndParent);
|
|
ATL::CWindow listview(hwndListView);
|
|
|
|
return ResizeListViewCW(listview, parent);
|
|
|
|
}
|
|
|
|
void CSxApwComctl32View::SwitchView(DWORD dwView)
|
|
{
|
|
DWORD dwStyle = m_comctl32.GetWindowLong(GWL_STYLE);
|
|
|
|
m_comctl32.SetWindowLong(GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | dwView);
|
|
ResizeListViewCW(m_comctl32, m_comctl32.GetParent());
|
|
|
|
return;
|
|
}
|
|
|
|
LRESULT CSxApwComctl32View::CmdSwitchListView(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
switch (wID) //
|
|
{
|
|
case IDM_LARGE_ICONS:
|
|
SwitchView(LVS_ICON);
|
|
break;
|
|
|
|
case IDM_SMALL_ICONS:
|
|
SwitchView(LVS_SMALLICON);
|
|
break;
|
|
|
|
case IDM_LIST:
|
|
SwitchView(LVS_LIST);
|
|
break;
|
|
|
|
case IDM_REPORT:
|
|
SwitchView(LVS_REPORT);
|
|
break;
|
|
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
void CSxApwComctl32View::UpdateMenu(HMENU hMenu)
|
|
{
|
|
UINT uID = 0 ;
|
|
DWORD dwStyle;
|
|
|
|
//uncheck all of these guys
|
|
CheckMenuItem(hMenu, IDM_LARGE_ICONS, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hMenu, IDM_SMALL_ICONS, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hMenu, IDM_LIST, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hMenu, IDM_REPORT, MF_BYCOMMAND | MF_UNCHECKED);
|
|
|
|
//check the appropriate view menu item
|
|
dwStyle = m_comctl32.GetWindowLongW(GWL_STYLE);
|
|
switch(dwStyle & LVS_TYPEMASK)
|
|
{
|
|
case LVS_ICON:
|
|
uID = IDM_LARGE_ICONS;
|
|
break;
|
|
|
|
case LVS_SMALLICON:
|
|
uID = IDM_SMALL_ICONS;
|
|
break;
|
|
|
|
case LVS_LIST:
|
|
uID = IDM_LIST;
|
|
break;
|
|
|
|
case LVS_REPORT:
|
|
uID = IDM_REPORT;
|
|
break;
|
|
}
|
|
CheckMenuRadioItem(hMenu, IDM_LARGE_ICONS, IDM_REPORT, uID, MF_BYCOMMAND | MF_CHECKED);
|
|
|
|
}
|
|
|
|
LRESULT CSxApwComctl32View::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
HMENU menu = LoadMenuW(GetInstance(), MAKEINTRESOURCEW(IDM_CONTEXT_MENU));
|
|
HMENU listcontextmenu = GetSubMenu(menu, 0);
|
|
|
|
UpdateMenu(listcontextmenu);
|
|
|
|
TrackPopupMenu(
|
|
listcontextmenu,
|
|
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
|
GET_X_LPARAM(lParam),
|
|
GET_Y_LPARAM(lParam),
|
|
0,
|
|
*this,
|
|
NULL);
|
|
|
|
DestroyMenu(menu);
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CSxApwComctl32View::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
ATL::CWindow parent = m_comctl32.GetParent();
|
|
return ResizeListViewCW(m_comctl32, parent);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::InitImageList(HWND hwndListView)
|
|
{
|
|
DWORD iconNum;
|
|
HIMAGELIST himlSmall;
|
|
HIMAGELIST himlLarge;
|
|
|
|
if (g_DataBaseType == FUSION_APPWEEK_UIVIEWER_DISPLAY_FILE_INFO)
|
|
iconNum = TOTAL_ICON_COUNT_FOR_FILE_INFO_DISPLAY;
|
|
else
|
|
iconNum = TOTAL_ICON_COUNT_FOR_DEV;
|
|
|
|
himlSmall = ImageList_Create(16, 16, ILC_COLORDDB | ILC_MASK, iconNum, 0);
|
|
himlLarge = ImageList_Create(32, 32, ILC_COLORDDB | ILC_MASK, iconNum, 0);
|
|
|
|
if (himlSmall && himlLarge)
|
|
{
|
|
HICON hIcon;
|
|
if (g_DataBaseType == FUSION_APPWEEK_UIVIEWER_DISPLAY_FILE_INFO)
|
|
{
|
|
//set up the small image list
|
|
for ( DWORD i = IDI_ICON_FILE_START; i <= IDI_ICON_FILE_END; i++)
|
|
{
|
|
hIcon = static_cast<HICON>(LoadImage(GetInstance(), MAKEINTRESOURCE(i), IMAGE_ICON, 16, 16, LR_VGACOLOR));
|
|
ImageList_AddIcon(himlSmall, hIcon);
|
|
|
|
//set up the large image list
|
|
hIcon = LoadIcon(GetInstance(), MAKEINTRESOURCE(i));
|
|
ImageList_AddIcon(himlLarge, hIcon);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
for ( DWORD i = IDB_BITMAP_DEV_START; i <= IDB_BITMAP_DEV_END; i++)
|
|
{
|
|
hIcon = static_cast<HICON>(LoadImage(GetInstance(), MAKEINTRESOURCE(i), IMAGE_ICON, 16, 16, LR_VGACOLOR));
|
|
ImageList_AddIcon(himlSmall, hIcon);
|
|
//set up the large image list
|
|
hIcon = LoadIcon(GetInstance(), MAKEINTRESOURCE(i));
|
|
ImageList_AddIcon(himlLarge, hIcon);
|
|
}
|
|
}
|
|
|
|
ListView_SetImageList(hwndListView, himlSmall, LVSIL_SMALL);
|
|
ListView_SetImageList(hwndListView, himlLarge, LVSIL_NORMAL);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::InitViewColumns(
|
|
HWND hwndListView
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
LV_COLUMN lvColumn;
|
|
DWORD index;
|
|
WCHAR szText[20];
|
|
DWORD iIndexStart, iIndexEnd;
|
|
|
|
//empty the list
|
|
ListView_DeleteAllItems(hwndListView);
|
|
|
|
//initialize the rgpszColumns
|
|
ZeroMemory(&lvColumn, sizeof(lvColumn));
|
|
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
lvColumn.fmt = LVCFMT_LEFT;
|
|
lvColumn.cx = 120;
|
|
lvColumn.pszText = szText;
|
|
|
|
if (g_DataBaseType == FUSION_APPWEEK_UIVIEWER_DISPLAY_FILE_INFO)
|
|
{
|
|
iIndexStart = IDS_FILE_COLUMN_START;
|
|
iIndexEnd = IDS_FILE_COLUMN_END;
|
|
}
|
|
else
|
|
{
|
|
iIndexStart = IDS_RAID_COLUMN_START;
|
|
iIndexEnd = IDS_RAID_COLUMN_END;
|
|
}
|
|
|
|
for (index = iIndexStart; index <= iIndexEnd; index++)
|
|
{
|
|
lvColumn.iSubItem = index;
|
|
LoadString(GetInstance(), index, szText, sizeof(szText));
|
|
if (ListView_InsertColumn(hwndListView, index, &lvColumn) == -1)
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
}
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::CreateWindow(
|
|
HWND hwndParent
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HWND hwndListView;
|
|
|
|
IFFALSE_WIN32TOHR_EXIT(
|
|
hr,
|
|
hwndListView = CreateWindowEx(
|
|
WS_EX_CLIENTEDGE,
|
|
WC_LISTVIEW,
|
|
L"",
|
|
WS_TABSTOP | WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_SORTASCENDING | LVS_REPORT,
|
|
0, 0, 0, 0,
|
|
hwndParent, // parent
|
|
(HMENU)ID_LISTVIEW, // ID
|
|
NULL, // instance
|
|
NULL)); // no extra data
|
|
|
|
IFFAILED_EXIT(hr = ResizeListView(hwndListView, hwndParent));
|
|
IFFAILED_EXIT(hr = InitImageList(hwndListView));
|
|
IFFAILED_EXIT(hr = InitViewColumns(hwndListView));
|
|
|
|
m_comctl32.Attach(hwndListView);
|
|
|
|
#undef SubclassWindow
|
|
this->SubclassWindow(hwndParent);
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::GetDisplayInfoBasedOnFileName(int & iIconIndex, PWSTR pwszFileType, const LPCWSTR pwszFileName)
|
|
{
|
|
// get icon and file type string
|
|
DWORD dwAttrib = GetFileAttributes(pwszFileName);
|
|
if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
wcscpy(pwszFileType, L"Dir");
|
|
iIconIndex = IDI_DIR - IDI_ICON_FILE_START;
|
|
}
|
|
else
|
|
{
|
|
WCHAR * p = wcsrchr(pwszFileName, L'.');
|
|
pwszFileType[0] = L'\0';
|
|
if (p == NULL)
|
|
{
|
|
wcscpy(pwszFileType, L"File");
|
|
iIconIndex = ICON_INEX_GENERAL_FILE;
|
|
}
|
|
else
|
|
{
|
|
for (DWORD i=0; i < sizeof(MatchTable_FileTypeViaFileExt) / sizeof(FILETYPEVIAFILEEXT); i++)
|
|
{
|
|
if (wcscmp(p, MatchTable_FileTypeViaFileExt[i].FileExt) == 0 )
|
|
{
|
|
wcscpy(pwszFileType, MatchTable_FileTypeViaFileExt[i].FileType);
|
|
iIconIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (pwszFileType[0] == L'\0')
|
|
{
|
|
wsprintf(pwszFileType, L"%s File", p++);
|
|
iIconIndex = ICON_INEX_GENERAL_FILE;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::GetDevIconBasedonEmailalias(int & iIconIndex, const LPCWSTR emailalias)
|
|
{
|
|
if (wcscmp(emailalias, L"jaykrell") == 0 )
|
|
iIconIndex = 0;
|
|
else if (wcscmp(emailalias, L"jonwis") == 0 )
|
|
iIconIndex = 1;
|
|
else if (wcscmp(emailalias, L"mgrier") == 0 )
|
|
iIconIndex = 2;
|
|
else if (wcscmp(emailalias, L"xiaoyuw") == 0 )
|
|
iIconIndex = 3;
|
|
else
|
|
iIconIndex = 4;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::FormatFileSizeInfo(WCHAR pwszFileSize[], const LPCWSTR pszFileSize)
|
|
{
|
|
int iSize= _wtol(pszFileSize);
|
|
if (iSize < 1000)
|
|
wcscpy(pwszFileSize, L"1K");
|
|
else
|
|
wsprintf(pwszFileSize, L"%dK", iSize / 1000);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CSxApwComctl32View::OnNextRow(
|
|
int nColumns,
|
|
const LPCWSTR rgpszColumns[]
|
|
)
|
|
{
|
|
LVITEM lvItem;
|
|
ZeroMemory(&lvItem, sizeof(lvItem));
|
|
int iIconIndex, iItemIndex;
|
|
HRESULT hr;
|
|
|
|
if (g_DataBaseType == FUSION_APPWEEK_UIVIEWER_DISPLAY_FILE_INFO)
|
|
{
|
|
|
|
WCHAR pwszFileType[MAX_PATH];
|
|
WCHAR pwszFileSize[MAX_PATH];
|
|
const LPCWSTR pszFullFileName = rgpszColumns[0];
|
|
PWSTR pszPartialFileName = wcsrchr(pszFullFileName, L'\\');
|
|
if (pszPartialFileName != NULL)
|
|
pszPartialFileName++;
|
|
if (pszPartialFileName == NULL)
|
|
pszPartialFileName = const_cast<LPWSTR>(pszFullFileName);
|
|
|
|
IFFAILED_EXIT(hr = GetDisplayInfoBasedOnFileName(iIconIndex, pwszFileType, pszFullFileName));
|
|
if (::GetFileAttributesW(pszFullFileName) & FILE_ATTRIBUTE_DIRECTORY)
|
|
pwszFileSize[0] = L'\0'; // dir
|
|
else
|
|
FormatFileSizeInfo(pwszFileSize, rgpszColumns[1]);
|
|
|
|
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
|
|
lvItem.pszText = pszPartialFileName;
|
|
lvItem.iItem = 0;
|
|
lvItem.iSubItem = 0;
|
|
lvItem.iImage = iIconIndex;
|
|
iItemIndex = ListView_InsertItem(m_comctl32, &lvItem);
|
|
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItemIndex;
|
|
lvItem.pszText = pwszFileSize;
|
|
lvItem.iSubItem = 1;
|
|
ListView_SetItem(m_comctl32, &lvItem);
|
|
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItemIndex;
|
|
lvItem.pszText = pwszFileType;
|
|
lvItem.iSubItem = 2;
|
|
ListView_SetItem(m_comctl32, &lvItem);
|
|
}
|
|
else
|
|
{
|
|
GetDevIconBasedonEmailalias(iIconIndex, rgpszColumns[0]);
|
|
|
|
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
|
|
lvItem.pszText = const_cast<LPWSTR>(rgpszColumns[0]);
|
|
lvItem.iItem = 0;
|
|
lvItem.iSubItem = 0;
|
|
lvItem.iImage = iIconIndex;
|
|
iItemIndex = ListView_InsertItem(m_comctl32, &lvItem);
|
|
|
|
for (int i=1; i<nColumns; i++)
|
|
{
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItemIndex;
|
|
lvItem.pszText = const_cast<LPWSTR>(rgpszColumns[i]);
|
|
lvItem.iSubItem = i;
|
|
ListView_SetItem(m_comctl32, &lvItem);
|
|
}
|
|
}
|
|
hr = S_OK;
|
|
Exit:
|
|
return hr;
|
|
}
|