Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1615 lines
47 KiB

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <windowsx.h>
#include "plv.h"
#include "plv_.h"
#include "plvproc.h"
#include "dbg.h"
#include "strutil.h"
#include "repview.h"
#include "iconview.h"
#ifdef UNDER_CE // Windows CE specific
#include "stub_ce.h" // Windows CE stub for unsupported APIs
#endif // UNDER_CE
#ifdef MSAA
#pragma message("->plv.cpp:MSAA supported.")
#include "accplv.h"
#include "ivmisc.h"
#include "rvmisc.h"
#endif // MSAA
#ifdef UNDER_CE
#ifdef FE_JAPANESE
#define MS_MINCHO_J TEXT("\xff2d\xff33 \x660e\x671d") // MS 明朝
#define MS_GOTHIC_J TEXT("\xff2d\xff33 \x30b4\x30b7\x30c3\x30af") // MS ゴシック
#elif FE_KOREAN
#define GULIM_KO TEXT("\xad74\xb9bc") // Gulim
#define BATANG_KO TEXT("\xbc14\xd0d5") // Batang
#endif
#else // UNDER_CE
#ifdef FE_KOREAN
#define GULIM_KO "\xb1\xbc\xb8\xb2" // Gulim
#define BATANG_KO "\xb9\xd9\xc5\xc1" // Batang
#endif
#endif
// Safe String
#define STRSAFE_NO_DEPRECATE
#include "strsafe.h"
extern LPPLVDATA PLV_Initialize(VOID);
extern VOID PLV_Destroy(LPPLVDATA lpPlv);
extern INT PLV_SetScrollInfo(HWND hwnd, INT nMin, INT nMax, INT nPage, INT nPos);
extern INT PLV_GetScrollTrackPos(HWND hwnd);
#ifdef UNDER_CE // In Windows CE, all window classes are process global.
static LPCTSTR MakeClassName(HINSTANCE hInst, LPTSTR lpszBuf)
{
// make module unique name
TCHAR szFileName[MAX_PATH];
GetModuleFileName(hInst, szFileName, MAX_PATH);
LPTSTR lpszFName = _tcsrchr(szFileName, TEXT('\\'));
if(lpszFName) *lpszFName = TEXT('_');
StringCchCopy(lpszBuf, MAX_PATH, WC_PADLISTVIEW);
StringCchCat(lpszBuf, MAX_PATH, lpszFName);
return lpszBuf;
}
BOOL PadListView_UnregisterClass(HINSTANCE hInst)
{
TCHAR szClassName[MAX_PATH];
return UnregisterClass(MakeClassName(hInst, szClassName), hInst);
}
#endif // UNDER_CE
//----------------------------------------------------------------
// Public API Declare
//----------------------------------------------------------------
//////////////////////////////////////////////////////////////////
// Function : PadListView_RegisterClass
// Type : static ATOM
// Purpose :
// Args :
// : HINSTANCE hInst
// : LPSTR lpstrClass
// : WNDPROC lpfnWndProc
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
#ifndef UNDER_CE
static BOOL PadListView_RegisterClass(HINSTANCE hInst, LPSTR lpstrClass, WNDPROC lpfnWndProc)
#else // UNDER_CE
static BOOL PadListView_RegisterClass(HINSTANCE hInst, LPTSTR lpstrClass, WNDPROC lpfnWndProc)
#endif // UNDER_CE
{
ATOM ret;
#ifndef UNDER_CE // Windows CE does not support EX
static WNDCLASSEX wc;
#else // UNDER_CE
WNDCLASS wc;
#endif // UNDER_CE
//----------------------------------------------------------------
//check specified class is already exist or not
//----------------------------------------------------------------
#ifndef UNDER_CE // Windows CE does not support EX
if(GetClassInfoEx(hInst, lpstrClass, &wc)){
#else // UNDER_CE
if(GetClassInfo(hInst, lpstrClass, &wc)){
#endif // UNDER_CE
//lpstrClass is already registerd.
return TRUE;
}
ZeroMemory(&wc, sizeof(wc));
#ifndef UNDER_CE // Windows CE does not support EX
wc.cbSize = sizeof(wc);
#endif // UNDER_CE
wc.style = CS_HREDRAW | CS_VREDRAW; /* Class style(s). */
wc.lpfnWndProc = (WNDPROC)lpfnWndProc;
wc.cbClsExtra = 0; /* No per-class extra data.*/
wc.cbWndExtra = sizeof(LPVOID); /* No per-window extra data. */
wc.hInstance = hInst; /* Application that owns the class. */
wc.hIcon = NULL; //LoadIcon(hInstance, MAKEINTRESOURCE(SCROLL32_ICON));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
//wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
//wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL; //g_szClass; /* Name of menu resource in .RC file. */
wc.lpszClassName = lpstrClass; /* Name used in call to CreateWindow. */
#ifndef UNDER_CE // Windows CE does not support EX
wc.hIconSm = NULL;
ret = RegisterClassEx(&wc);
#else // UNDER_CE
ret = RegisterClass(&wc);
#endif // UNDER_CE
return ret ? TRUE: FALSE;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_CreateWindow
// Type : HWND
// Purpose :
// Args :
// : HINSTANCE hInst
// : HWND hwndParent
// : INT x
// : INT y
// : INT width
// : INT height
// : UINT uNotifyMsg
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
HWND WINAPI PadListView_CreateWindow(HINSTANCE hInst,
HWND hwndParent,
INT wID,
INT x,
INT y,
INT width,
INT height,
UINT uNotifyMsg)
{
HWND hwnd;
#ifndef UNDER_CE // In Windows CE, all window classes are process global.
BOOL ret = PadListView_RegisterClass(hInst, WC_PADLISTVIEW, PlvWndProc);
#else // UNDER_CE
TCHAR szClassName[MAX_PATH];
MakeClassName(hInst, szClassName);
BOOL ret = PadListView_RegisterClass(hInst, szClassName, PlvWndProc);
#endif // UNDER_CE
if(!ret) {
Dbg(("Failed to Regiset class[%s]\n", WC_PADLISTVIEW));
return NULL;
}
LPPLVDATA lpPlvData = PLV_Initialize();
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return NULL;
}
lpPlvData->hInst = hInst;
lpPlvData->uMsg = uNotifyMsg;
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
#ifndef UNDER_CE // All CE window class is process global.
WC_PADLISTVIEW,
WC_PADLISTVIEW,
#else // UNDER_CE
szClassName,
szClassName,
#endif // UNDER_CE
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
x, y,
width,
height,
hwndParent,
(HMENU)(UINT_PTR)wID,
hInst,
(LPVOID)lpPlvData);
if(!hwnd) {
Dbg(("Create Window Failed \n"));
return NULL;
}
return hwnd;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_GetItemCount
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_GetItemCount(HWND hwnd)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
return lpPlvData->iItemCount;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetItemCount
// Type : INT
// Purpose : Set total Item's count to PadListView.
// : it effect's scroll bar.
// Args :
// : HWND hwnd
// : INT itemCount
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetItemCount(HWND hwnd, INT itemCount)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
if(lpPlvData->dwStyle == PLVSTYLE_ICON) {
IconView_SetItemCount(lpPlvData, itemCount, TRUE);
RepView_SetItemCount(lpPlvData, itemCount, FALSE);
}
else if(lpPlvData->dwStyle == PLVSTYLE_REPORT) {
IconView_SetItemCount(lpPlvData, itemCount, FALSE);
RepView_SetItemCount(lpPlvData, itemCount, TRUE);
}
PadListView_Update(hwnd);
return 0;
Unref(itemCount);
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetExplanationText
// Type : INT
// Purpose : set the PadListView's text .
// Args :
// : HWND hwnd
// : LPSTR lpText
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
extern INT WINAPI PadListView_SetExplanationText(HWND hwnd, LPSTR lpText)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
lpPlvData->lpText = lpText; // lpText must point to a static data
PadListView_Update(hwnd);
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetExplanationTextW
// Type : INT
// Purpose : set the PadListView's text .
// Args :
// : HWND hwnd
// : LPWSTR lpText
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
extern INT WINAPI PadListView_SetExplanationTextW(HWND hwnd, LPWSTR lpwText)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
lpPlvData->lpwText = lpwText; // lpText must point to a static data
PadListView_Update(hwnd);
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetTopIndex
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// : INT indexTop
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetTopIndex(HWND hwnd, INT indexTop)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
if(lpPlvData->dwStyle == PLVSTYLE_ICON) {
return IconView_SetTopIndex(lpPlvData, indexTop);
}
else if(lpPlvData->dwStyle == PLVSTYLE_REPORT) {
return RepView_SetTopIndex(lpPlvData, indexTop);
}
else {
Dbg(("Internal ERROR\n"));
}
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_GetTopIndex
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_GetTopIndex(HWND hwnd)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
if(lpPlvData->dwStyle == PLVSTYLE_ICON) {
return lpPlvData->iCurIconTopIndex;
}
else {
return lpPlvData->iCurTopIndex;
}
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetIconItemCallback
// Type : INT
// Purpose : Set user defined Function that gets each Item's string
// Args :
// : HWND hwnd
// : LPARAM lParam
// : LPFNPLVITEMCALLBACK lpfnPlvItemCallback
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetIconItemCallback(HWND hwnd, LPARAM lParam, LPFNPLVICONITEMCALLBACK lpfnPlvIconItemCallback)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
lpPlvData->iconItemCallbacklParam = lParam;
lpPlvData->lpfnPlvIconItemCallback = lpfnPlvIconItemCallback;
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetReportItemCallback
// Type : INT
// Purpose : Set user defined Function that gets each column's string
// : in Report view.
// Args :
// : HWND hwnd
// : LPFNPLVCOLITEMCALLBACK lpfnColItemCallback
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetReportItemCallback(HWND hwnd, LPARAM lParam, LPFNPLVREPITEMCALLBACK lpfnPlvRepItemCallback)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
lpPlvData->repItemCallbacklParam = lParam;
lpPlvData->lpfnPlvRepItemCallback = lpfnPlvRepItemCallback;
return 0;
}
typedef struct tagFONTINFO {
LPTSTR lpstrFontName;
BOOL fFound;
LPLOGFONT lpLogFont;
}FONTINFO, *LPFONTINFO;
static INT CALLBACK EnumFontFamProc(ENUMLOGFONT *lpElf,
NEWTEXTMETRIC *lpNtm,
INT iFontType,
LPARAM lParam)
{
//Dbg(("EnumFontFamProc font[%s]\n", lpElf->elfLogFont.lfFaceName));
#ifndef UNDER_CE // always Unicode
if(0 == StrcmpA(lpElf->elfLogFont.lfFaceName, ((FONTINFO *)lParam)->lpstrFontName)) {
#else // UNDER_CE
if(0 == lstrcmp(lpElf->elfLogFont.lfFaceName, ((FONTINFO *)lParam)->lpstrFontName)) {
#endif // UNDER_CE
*((LPFONTINFO)lParam)->lpLogFont = lpElf->elfLogFont;
((LPFONTINFO)lParam)->fFound = TRUE;
return 0;
}
return 1;
Unref(lpNtm);
Unref(iFontType);
}
static INT GetLogFont(HDC hDC, LPTSTR lpstrFaceName, LOGFONT *plf)
{
static FONTINFO fontInfo;
if(!lpstrFaceName) {
Dbg(("GetLogFont Error lpstrFaceName is NULL\n"));
return -1;
}
if(lstrlen(lpstrFaceName) >= LF_FACESIZE) {
Dbg(("GetLogFont Error length invalid\n"));
return -1;
}
if(!plf) {
Dbg(("GetLogFont Error plf is NULL\n"));
return -1;
}
ZeroMemory(&fontInfo, sizeof(fontInfo));
fontInfo.lpstrFontName = lpstrFaceName;
fontInfo.lpLogFont = plf;
EnumFontFamilies(hDC, NULL, (FONTENUMPROC)EnumFontFamProc, (LPARAM)&fontInfo);
if(fontInfo.fFound) {
return 0;
}
else {
return -1;
}
}
typedef struct tagFONTINFOEX {
LPTSTR lpstrFontName;
INT charSet;
BOOL fFound;
LPLOGFONT lpLogFont;
}FONTINFOEX, *LPFONTINFOEX;
static INT CALLBACK EnumFontFamProcEx(ENUMLOGFONT *lpElf,
NEWTEXTMETRIC *lpNtm,
INT iFontType,
LPARAM lParam)
{
//Dbg(("EnumFontFamProc font[%s]\n", lpElf->elfLogFont.lfFaceName));
if(0 == StrcmpA(lpElf->elfLogFont.lfFaceName, ((FONTINFOEX *)lParam)->lpstrFontName)) {
if((BYTE)((FONTINFOEX *)lParam)->charSet == lpElf->elfLogFont.lfCharSet) {
*((LPFONTINFOEX)lParam)->lpLogFont = lpElf->elfLogFont;
((LPFONTINFOEX)lParam)->fFound = TRUE;
return 0;
}
}
return 1;
Unref(lpNtm);
Unref(iFontType);
}
static INT GetLogFontEx(HDC hDC,
LPTSTR lpstrFaceName,
INT charSet,
LOGFONT *plf)
{
Dbg(("!!!!!! GetLogFont charSet[%d]\n", charSet));
static FONTINFOEX fontInfo;
if(!lpstrFaceName) {
Dbg(("GetLogFont Error lpstrFaceName is NULL\n"));
return -1;
}
if(lstrlen(lpstrFaceName) >= LF_FACESIZE) {
Dbg(("GetLogFont Error length invalid\n"));
return -1;
}
if(!plf) {
Dbg(("GetLogFont Error plf is NULL\n"));
return -1;
}
ZeroMemory(&fontInfo, sizeof(fontInfo));
fontInfo.lpstrFontName = lpstrFaceName;
fontInfo.charSet = charSet;
fontInfo.lpLogFont = plf;
static LOGFONT logFont;
ZeroMemory(&logFont, sizeof(logFont));
logFont.lfCharSet = (BYTE)charSet,
#ifndef UNDER_CE
StrcpyA(logFont.lfFaceName, lpstrFaceName);
#else // UNDER_CE
lstrcpy(logFont.lfFaceName, lpstrFaceName);
#endif // UNDER_CE
#ifndef UNDER_CE // Windows CE does not support EnumFontFamiliesEx
EnumFontFamiliesEx(hDC,
&logFont,
(FONTENUMPROC)EnumFontFamProcEx,
(LPARAM)&fontInfo,
0);
#else // UNDER_CE
EnumFontFamilies(hDC,
logFont.lfFaceName,
(FONTENUMPROC)EnumFontFamProcEx,
(LPARAM)&fontInfo);
#endif // UNDER_CE
if(fontInfo.fFound) {
return 0;
}
else {
return -1;
}
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetIconFont
// Type : INT
// Purpose : Set specifed Font for ICON View.
// Args :
// : HWND hwnd
// : LPSTR lpstrFontName
// : INT point
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
#define ABS(a) (a > 0 ? a: -a)
//for do not use stack.
static TEXTMETRIC g_tm;
static LOGFONT g_logFont;
INT WINAPI PadListView_SetIconFont(HWND hwnd, LPTSTR lpstrFontName, INT point)
{
Dbg(("PadListView_SetIconFont START font[%s] point[%d]\n", lpstrFontName, point));
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("PadListView_SetIconFont ERROR\n"));
return 0;
}
HFONT hFont;
HDC hDC = GetDC(hwnd);
INT dpi = GetDeviceCaps(hDC, LOGPIXELSY);
if(-1 == GetLogFont(hDC, lpstrFontName, &g_logFont)) {
Dbg(("GetLogFont Error [%s]\n", lpstrFontName));
#ifndef UNDER_CE
#ifdef FE_JAPANESE
if(0 == lstrcmp(lpstrFontName, "MS 明朝")) {
GetLogFont(hDC, "MS Mincho", &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, "MS ゴシック")) {
GetLogFont(hDC, "MS Gothic", &g_logFont);
}
#elif FE_KOREAN
if(0 == lstrcmp(lpstrFontName, GULIM_KO)) {
GetLogFont(hDC, "Gulim", &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, BATANG_KO)) {
GetLogFont(hDC, "Batang", &g_logFont);
}
#else
return (-1);
#endif
#else // UNDER_CE
#ifdef FE_JAPANESE
if(0 == lstrcmp(lpstrFontName, MS_MINCHO_J)) {
GetLogFont(hDC, TEXT("MS Mincho"), &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, MS_GOTHIC_J)) {
GetLogFont(hDC, TEXT("MS Gothic"), &g_logFont);
}
#elif FE_KOREAN
if(0 == lstrcmp(lpstrFontName, GULIM_KO)) {
GetLogFont(hDC, TEXT("Gulim"), &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, BATANG_KO)) {
GetLogFont(hDC, TEXT("Batang"), &g_logFont);
}
#else
return (-1);
#endif
#endif // UNDER_CE
}
ReleaseDC(hwnd, hDC);
//----------------------------------------------------------------
//Set new size
//----------------------------------------------------------------
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfWidth = 0; // Calcurated automatically by lfHeight.
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontIcon) {
DeleteObject(lpPlvData->hFontIcon);
}
lpPlvData->iFontPointIcon = point;
lpPlvData->hFontIcon = hFont;
//If font point changed, also changes itemWidth & itemHeight
lpPlvData->nItemWidth = ABS(g_logFont.lfHeight) + XRECT_MARGIN*2;
lpPlvData->nItemHeight = ABS(g_logFont.lfHeight) + YRECT_MARGIN*2;
PadListView_Update(hwnd);
Dbg(("PadListView_SetFont END\n"));
#if 0
HFONT hFont;
//use global data logfont, TextMetrics
ZeroMemory(&g_logFont, sizeof(g_logFont));
ZeroMemory(&g_tm, sizeof(g_tm));
HDC hDC = GetDC(hwnd);
if(!hDC) {
Dbg(("PadListView_SetIconFont ERROR\n"));
return -1;
}
GetTextMetrics(hDC, &g_tm);
INT dpi = GetDeviceCaps(hDC, LOGPIXELSY);
ReleaseDC(hwnd, hDC);
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfCharSet = DEFAULT_CHARSET; //g_tm.tmCharSet;
g_logFont.lfPitchAndFamily = g_tm.tmPitchAndFamily;
Dbg(("g_logFont.lfHeight = %d\n", g_logFont.lfHeight));
Dbg(("g_logFont.lfCharSet = %d\n", g_logFont.lfCharSet));
Dbg(("g_logFont.lfPitchAndFamily = %d\n", g_logFont.lfPitchAndFamily));
StrcpyA(g_logFont.lfFaceName, lpstrFontName);
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontIcon) {
DeleteObject(lpPlvData->hFontIcon);
}
lpPlvData->iFontPointIcon = point;
lpPlvData->hFontIcon = hFont;
//If font point changed, also changes itemWidth & itemHeight
lpPlvData->nItemWidth = ABS(g_logFont.lfHeight) + XRECT_MARGIN*2;
lpPlvData->nItemHeight = ABS(g_logFont.lfHeight) + YRECT_MARGIN*2;
PadListView_Update(hwnd);
Dbg(("PadListView_SetFont END\n"));
#endif
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetReportFont
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// : LPSTR lpstrFontName
// : INT point
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetReportFont(HWND hwnd, LPTSTR lpstrFontName, INT point)
{
Dbg(("PadListView_SetReportFont START\n"));
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("PadListView_SetReportFont ERROR\n"));
return 0;
}
HFONT hFont;
ZeroMemory(&g_logFont, sizeof(g_logFont));
HDC hDC = GetDC(hwnd);
INT dpi = GetDeviceCaps(hDC, LOGPIXELSY);
if(-1 == GetLogFont(hDC, lpstrFontName, &g_logFont)) {
Dbg(("GetLogFont Error [%s]\n", lpstrFontName));
#ifndef UNDER_CE
#ifdef FE_JAPANESE
if(0 == lstrcmp(lpstrFontName, "MS 明朝")) {
GetLogFont(hDC, "MS Mincho", &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, "MS ゴシック")) {
GetLogFont(hDC, "MS Gothic", &g_logFont);
}
#elif FE_KOREAN
if(0 == lstrcmp(lpstrFontName, GULIM_KO)) {
GetLogFont(hDC, "Gulim", &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, BATANG_KO)) {
GetLogFont(hDC, "Batang", &g_logFont);
}
#else
return (-1);
#endif
#else // UNDER_CE
#ifdef FE_JAPANESE
if(0 == lstrcmp(lpstrFontName, MS_MINCHO_J)) {
GetLogFont(hDC, TEXT("MS Mincho"), &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, MS_GOTHIC_J)) {
GetLogFont(hDC, TEXT("MS Gothic"), &g_logFont);
}
#elif FE_KOREAN
if(0 == lstrcmp(lpstrFontName, GULIM_KO)) {
GetLogFont(hDC, TEXT("Gulim"), &g_logFont);
}
else if(0 == lstrcmp(lpstrFontName, BATNANG_KO)) {
GetLogFont(hDC, TEXT("Batang"), &g_logFont);
}
#else
return (-1);
#endif
#endif // UNDER_CE
}
ReleaseDC(hwnd, hDC);
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfWidth = 0;
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontRep) {
DeleteObject(lpPlvData->hFontRep);
}
lpPlvData->iFontPointRep = point;
lpPlvData->hFontRep = hFont;
//If font point changed, also changes itemWidth & itemHeight
lpPlvData->nRepItemWidth = ABS(g_logFont.lfHeight) + PLV_REPRECT_XMARGIN*2;
lpPlvData->nRepItemHeight = ABS(g_logFont.lfHeight) + PLV_REPRECT_YMARGIN*2;
PadListView_Update(hwnd);
return 0;
#if 0
HFONT hFont;
HDC hDC = GetDC(hwnd);
if(!hDC) {
Dbg(("PadListView_SetReportFont ERROR\n"));
return -1;
}
ZeroMemory(&g_tm, sizeof(g_tm));
GetTextMetrics(hDC, &g_tm);
INT dpi = GetDeviceCaps(hDC, LOGPIXELSY);
ReleaseDC(hwnd, hDC);
ZeroMemory(&g_logFont, sizeof(g_logFont));
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfCharSet = DEFAULT_CHARSET; //g_tm.tmCharSet;
g_logFont.lfPitchAndFamily = g_tm.tmPitchAndFamily;
Dbg(("g_logFont.lfHeight = %d\n", g_logFont.lfHeight));
Dbg(("g_logFont.lfCharSet = %d\n", g_logFont.lfCharSet));
Dbg(("g_logFont.lfPitchAndFamily = %d\n", g_logFont.lfPitchAndFamily));
StrcpyA(g_logFont.lfFaceName, lpstrFontName);
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontRep) {
DeleteObject(lpPlvData->hFontRep);
}
lpPlvData->iFontPointRep = point;
lpPlvData->hFontRep = hFont;
//If font point changed, also changes itemWidth & itemHeight
lpPlvData->nRepItemWidth = ABS(g_logFont.lfHeight) + PLV_REPRECT_XMARGIN*2;
lpPlvData->nRepItemHeight = ABS(g_logFont.lfHeight) + PLV_REPRECT_YMARGIN*2;
PadListView_Update(hwnd);
Dbg(("PadListView_SetFont END\n"));
return 0;
#endif
}
//
///
//990126:toshiaK
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetIconFontEx
// Type : INT
// Purpose : Set specifed Font for ICON View.
// Args :
// : HWND hwnd
// : LPSTR lpstrFontName
// : INT charSet
// : INT point
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetIconFontEx(HWND hwnd,
LPTSTR lpstrFontName,
INT charSet,
INT point)
{
Dbg(("PadListView_SetIconFontEx START font[%s] point[%d]\n", lpstrFontName, point));
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("PadListView_SetIconFont ERROR\n"));
return 0;
}
HFONT hFont;
HDC hDC = GetDC(hwnd);
INT dpi = GetDeviceCaps(hDC, LOGPIXELSY);
if(-1 == GetLogFontEx(hDC, lpstrFontName, charSet, &g_logFont)) {
ReleaseDC(hwnd, hDC);
return -1;
}
ReleaseDC(hwnd, hDC);
//----------------------------------------------------------------
//Set new size
//----------------------------------------------------------------
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfWidth = 0; // Calcurated automatically by lfHeight.
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontIcon) {
DeleteObject(lpPlvData->hFontIcon);
}
lpPlvData->iFontPointIcon = point;
lpPlvData->hFontIcon = hFont;
//If font point changed, also changes itemWidth & itemHeight
lpPlvData->nItemWidth = ABS(g_logFont.lfHeight) + XRECT_MARGIN*2;
lpPlvData->nItemHeight = ABS(g_logFont.lfHeight) + YRECT_MARGIN*2;
PadListView_Update(hwnd);
Dbg(("PadListView_SetFont END\n"));
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetReportFontEx
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// : LPSTR lpstrFontName
// : INT charSet
// : INT point
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetReportFontEx(HWND hwnd,
LPTSTR lpstrFontName,
INT charSet,
INT point)
{
Dbg(("PadListView_SetReportFontEx START\n"));
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("PadListView_SetReportFont ERROR\n"));
return 0;
}
HFONT hFont;
ZeroMemory(&g_logFont, sizeof(g_logFont));
HDC hDC = GetDC(hwnd);
INT dpi = GetDeviceCaps(hDC, LOGPIXELSY);
if(-1 == GetLogFontEx(hDC, lpstrFontName, charSet, &g_logFont)) {
ReleaseDC(hwnd, hDC);
return -1;
}
ReleaseDC(hwnd, hDC);
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfWidth = 0;
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontRep) {
DeleteObject(lpPlvData->hFontRep);
}
lpPlvData->iFontPointRep = point;
lpPlvData->hFontRep = hFont;
//If font point changed, also changes itemWidth & itemHeight
lpPlvData->nRepItemWidth = ABS(g_logFont.lfHeight) + PLV_REPRECT_XMARGIN*2;
lpPlvData->nRepItemHeight = ABS(g_logFont.lfHeight) + PLV_REPRECT_YMARGIN*2;
PadListView_Update(hwnd);
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetStyle
// Type : INT
// Purpose : set the PadListView's style.
// style is PLVSTYLE_LIST or PLVSTYLE_REPORT
// Args :
// : HWND hwnd
// : INT style
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetStyle(HWND hwnd, INT style)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("PadListView_SetStyle ERROR\n"));
return -1;
}
if(style != PLVSTYLE_ICON &&
style != PLVSTYLE_REPORT) {
Dbg(("Internal ERROR\n"));
return -1;
}
lpPlvData->dwStyle = style;
if(style == PLVSTYLE_ICON) {
if(lpPlvData->hwndHeader) {
//Hide header control
SetWindowPos(lpPlvData->hwndHeader, NULL, 0, 0, 0, 0,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
}
IconView_RestoreScrollPos(lpPlvData);
}
else if(style == PLVSTYLE_REPORT) {
if(lpPlvData->hwndHeader) {
RECT rc;
GetClientRect(lpPlvData->hwndSelf, &rc); // get PadListView's client rect
HD_LAYOUT hdl;
WINDOWPOS wp;
hdl.prc = &rc;
hdl.pwpos = &wp;
//Calc header control window size
if(Header_Layout(lpPlvData->hwndHeader, &hdl) == FALSE) {
//OutputDebugString("Create Header Layout error\n");
return NULL;
}
SetWindowPos(lpPlvData->hwndHeader, wp.hwndInsertAfter, wp.x, wp.y,
wp.cx, wp.cy, wp.flags | SWP_SHOWWINDOW);
}
RepView_RestoreScrollPos(lpPlvData);
}
PadListView_Update(hwnd);
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_GetStyle
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_GetStyle(HWND hwnd)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("PadListView_SetFont ERROR\n"));
return -1;
}
return (INT)lpPlvData->dwStyle;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_Update
// Type : INT
// Purpose : Repaint PadListView.
// Args :
// : HWND hwnd
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_Update(HWND hwnd)
{
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetCurSel
// Type : INT
// Purpose : set cur selection. Move cursor to specified index.
// :
// Args :
// : HWND hwnd
// : LPSTR lpText
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetCurSel(HWND hwnd, INT index)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
return -1;
}
switch(lpPlvData->dwStyle) {
case PLVSTYLE_ICON:
IconView_SetCurSel(lpPlvData, index);
break;
case PLVSTYLE_REPORT:
RepView_SetCurSel(lpPlvData, index);
break;
default:
break;
}
return 0;
}
#if 0
typedef struct _LV_COLUMNA
{
UINT mask; //LVCF_FMT, LVCF_WIDTH, LVCF_TEXT, LVCF_SUBITEM;
int fmt;
int cx;
LPSTR pszText;
int cchTextMax;
int iSubItem;
} LV_COLUMNA;
#define HDI_WIDTH 0x0001
#define HDI_HEIGHT HDI_WIDTH
#define HDI_TEXT 0x0002
#define HDI_FORMAT 0x0004
#define HDI_LPARAM 0x0008
#define HDI_BITMAP 0x0010
#define HDF_LEFT 0
#define HDF_RIGHT 1
#define HDF_CENTER 2
#define HDF_JUSTIFYMASK 0x0003
#define HDF_RTLREADING 4
#define LVCF_FMT 0x0001
#define LVCF_WIDTH 0x0002
#define LVCF_TEXT 0x0004
#define LVCF_SUBITEM 0x0008
#define LVCFMT_LEFT 0x0000
#define LVCFMT_RIGHT 0x0001
#define LVCFMT_CENTER 0x0002
#define LVCFMT_JUSTIFYMASK 0x0003
#endif
//////////////////////////////////////////////////////////////////
// Function : PadListView_InsertColumn
// Type : INT
// Purpose :
// Args :
// : HWND hwnd
// : INT index
// : PLV_COLUMN * lpPlvCol
// Return :
// DATE :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_InsertColumn(HWND hwnd, INT index, PLV_COLUMN *lpPlvCol)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return -1;
}
if(!lpPlvCol) {
Dbg(("Internal ERROR\n"));
return -1;
}
#ifndef UNDER_CE // always Unicode
if(::IsWindowUnicode(lpPlvData->hwndHeader)) {
#endif // UNDER_CE
static HD_ITEMW hdi;
#ifndef UNDER_CE // #ifndef UNICODE
static WCHAR wchBuf[256];
#endif // UNDER_CE
ZeroMemory(&hdi, sizeof(hdi));
if(lpPlvCol->mask & LVCF_FMT) { hdi.mask |= HDI_FORMAT; }
if(lpPlvCol->mask & LVCF_WIDTH) { hdi.mask |= HDI_WIDTH; }
if(lpPlvCol->mask & LVCF_TEXT) { hdi.mask |= HDI_TEXT; }
if(lpPlvCol->fmt & LVCFMT_LEFT) { hdi.fmt |= HDF_LEFT; }
if(lpPlvCol->fmt & LVCFMT_RIGHT) { hdi.fmt |= HDF_RIGHT; }
if(lpPlvCol->fmt & LVCFMT_CENTER) { hdi.fmt |= HDF_CENTER;}
if(lpPlvCol->fmt & LVCFMT_JUSTIFYMASK) { hdi.fmt |= HDF_JUSTIFYMASK;}
#ifndef UNDER_CE // #ifndef UNICODE
//----------------------------------------------------------------
//980728: for ActiveIME support. use lpPlvData->codePage to convert
//----------------------------------------------------------------
::MultiByteToWideChar(lpPlvData->codePage,
MB_PRECOMPOSED,
lpPlvCol->pszText, -1,
(WCHAR*)wchBuf, sizeof(wchBuf)/sizeof(WCHAR) );
hdi.pszText = wchBuf; //lpPlvCol->pszText;
#else // UNDER_CE
hdi.pszText = lpPlvCol->pszText;
#endif // UNDER_CE
hdi.cxy = lpPlvCol->cx;
hdi.cchTextMax = lpPlvCol->cchTextMax;
hdi.fmt |= HDF_OWNERDRAW; //989727: always set ownerdraw
SendMessageW(lpPlvData->hwndHeader, HDM_INSERTITEMW, (WPARAM)index, (LPARAM)&hdi);
#ifndef UNDER_CE // always Unicode
}
else {
static HD_ITEMA hdi;
ZeroMemory(&hdi, sizeof(hdi));
if(lpPlvCol->mask & LVCF_FMT) { hdi.mask |= HDI_FORMAT; }
if(lpPlvCol->mask & LVCF_WIDTH) { hdi.mask |= HDI_WIDTH; }
if(lpPlvCol->mask & LVCF_TEXT) { hdi.mask |= HDI_TEXT; }
if(lpPlvCol->fmt & LVCFMT_LEFT) { hdi.fmt |= HDF_LEFT; }
if(lpPlvCol->fmt & LVCFMT_RIGHT) { hdi.fmt |= HDF_RIGHT; }
if(lpPlvCol->fmt & LVCFMT_CENTER) { hdi.fmt |= HDF_CENTER;}
if(lpPlvCol->fmt & LVCFMT_JUSTIFYMASK) { hdi.fmt |= HDF_JUSTIFYMASK;}
hdi.pszText = lpPlvCol->pszText;
hdi.cxy = lpPlvCol->cx;
hdi.cchTextMax = lpPlvCol->cchTextMax;
hdi.fmt |= HDF_OWNERDRAW; //989727: always set ownerdraw
Header_InsertItem(lpPlvData->hwndHeader, index, &hdi);
}
#endif // UNDER_CE
return 0;
}
//----------------------------------------------------------------
// Private API Declaration
//----------------------------------------------------------------
LPPLVDATA PLV_Initialize(VOID)
{
LPPLVDATA lpPlvData = (LPPLVDATA)MemAlloc(sizeof(PLVDATA));
if(!lpPlvData) {
Dbg(("Memory ERROR\n"));
return (LPPLVDATA)NULL;
}
ZeroMemory((LPVOID)lpPlvData, sizeof(PLVDATA));
//----------------------------------------------------------------
//IconView, Report view Common data.
//----------------------------------------------------------------
lpPlvData->dwSize = sizeof(PLVDATA); //this data size;
lpPlvData->dwStyle = PLVSTYLE_ICON; //Pad listview window style (PLVIF_XXXX)
lpPlvData->hwndSelf = NULL; //Pad listview window handle.
lpPlvData->iItemCount = 0; //Virtual total item Count. it effects scroll bar.
lpPlvData->iCurTopIndex = 0; //In report view top line..
lpPlvData->nCurScrollPos = 0; //In report view Current Scroll posision.
lpPlvData->iCurIconTopIndex = 0; //In icon view top line..
lpPlvData->nCurIconScrollPos= 0; //In icon view Scroll posision.
lpPlvData->uMsg = 0; // user notify message.
lpPlvData->iCapture = CAPTURE_NONE; //is mouse captured or not.
lpPlvData->ptCapture.x = 0; //LButton Down mouse point.
lpPlvData->ptCapture.y = 0; //LButton Down mouse point.
//----------------------------------------------------------------
//for Icon view
//----------------------------------------------------------------
lpPlvData->nItemWidth = PLVICON_DEFAULT_WIDTH; // List(Icon like )view's whole width.
lpPlvData->nItemHeight = PLVICON_DEFAULT_HEIGHT; // List(Icon like )view's whole height.
lpPlvData->iFontPointIcon = PLVICON_DEFAULT_FONTPOINT; // Icon View's font point.
lpPlvData->hFontIcon = NULL; // Icon View's font
lpPlvData->iconItemCallbacklParam = (LPARAM)0; // Callback data for LPFNPLVITEMCALLBACK
lpPlvData->lpfnPlvIconItemCallback = NULL; //Callback function for getting item by index.
//----------------------------------------------------------------
//for report view
//----------------------------------------------------------------
lpPlvData->hwndHeader = NULL; //Header control's window handle.
lpPlvData->nRepItemWidth = PLVREP_DEFAULT_WIDTH; //Report view's width
lpPlvData->nRepItemHeight = PLVREP_DEFAULT_HEIGHT; //Report view's height
lpPlvData->iFontPointRep = PLVREP_DEFAULT_FONTPOINT; // Report View's font point.
lpPlvData->hFontRep = NULL; // Report View's font
lpPlvData->repItemCallbacklParam = (LPARAM)0;
lpPlvData->lpfnPlvRepItemCallback = NULL; //Callback function for getting colitem by index.
lpPlvData->lpText = NULL;
lpPlvData->codePage = CP_ACP; //980727
#ifdef MSAA
PLV_InitMSAA(lpPlvData);
#endif
return lpPlvData;
}
VOID PLV_Destroy(LPPLVDATA lpPlv)
{
if(lpPlv) {
#ifdef MSAA
PLV_UninitMSAA(lpPlv);
#endif
MemFree(lpPlv);
}
return;
}
INT PLV_SetScrollInfo(HWND hwnd, INT nMin, INT nMax, INT nPage, INT nPos)
{
static SCROLLINFO scrInfo;
scrInfo.cbSize = sizeof(scrInfo);
scrInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
scrInfo.nMin = nMin;
scrInfo.nMax = nMax-1;
scrInfo.nPage = nPage;
scrInfo.nPos = nPos;
scrInfo.nTrackPos = 0;
if((scrInfo.nMax - scrInfo.nMin +1) <= (INT)scrInfo.nPage) {
scrInfo.nMin = 0;
scrInfo.nMax = 1;
scrInfo.nPage = 1;
#ifndef UNDER_CE // Windows CE does not support EnableScrollBar
SetScrollInfo(hwnd, SB_VERT, &scrInfo, TRUE);
EnableScrollBar(hwnd, SB_VERT, ESB_DISABLE_BOTH);
#else // UNDER_CE
scrInfo.fMask |= SIF_DISABLENOSCROLL;
SetScrollInfo(hwnd, SB_VERT, &scrInfo, TRUE);
#endif // UNDER_CE
}
else {
#ifndef UNDER_CE // Windows CE does not support EnableScrollBar
EnableScrollBar(hwnd, SB_VERT, ESB_ENABLE_BOTH);
#endif // UNDER_CE
SetScrollInfo(hwnd, SB_VERT, &scrInfo, TRUE);
}
return 0;
}
INT PLV_GetScrollTrackPos(HWND hwnd)
{
static SCROLLINFO scrInfo;
scrInfo.cbSize = sizeof(scrInfo);
scrInfo.fMask = SIF_ALL;
GetScrollInfo(hwnd, SB_VERT, &scrInfo);
return scrInfo.nTrackPos;
}
INT WINAPI PadListView_SetExtendStyle(HWND hwnd, INT style)
{
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(!lpPlvData) {
Dbg(("Internal ERROR\n"));
return 0;
}
if(lpPlvData->hwndHeader) {
INT s = (INT)GetWindowLong(lpPlvData->hwndHeader, GWL_STYLE);
SetWindowLong(lpPlvData->hwndHeader, GWL_STYLE, (LONG)(s & ~HDS_BUTTONS));
}
return 0;
Unref(style);
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_GetWidthByColumn
// Type : INT WINAPI
// Purpose : Calc PLV's window width by specified Column count
// : This is PLVS_ICONVIEW style only.
// Args :
// : HWND hwnd PadListView window handle
// : INT col column count
// Return : width by pixel.
// DATE : 971120
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_GetWidthByColumn(HWND hwnd, INT col)
{
LPPLVDATA lpPlv = GetPlvDataFromHWND(hwnd);
return IconView_GetWidthByColumn(lpPlv, col);
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_GetHeightByRow
// Type : INT WINAPI
// Purpose : Calc PLV's window height
// by specified Row count.
// This is PLVS_ICONVIEW style only.
// Args :
// : HWND hwnd PLV's window handle
// : INT row row count
// Return : height in pixel
// DATE : 971120
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_GetHeightByRow(HWND hwnd, INT row)
{
LPPLVDATA lpPlv = GetPlvDataFromHWND(hwnd);
return IconView_GetHeightByRow(lpPlv, row);
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetHeaderFont
// Type : INT WINAPI
// Purpose :
// Args :
// : HWND hwnd
// : LPSTR lpstrFontName
// Return :
// DATE : Tue Jul 28 08:58:06 1998
// Histroy :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetHeaderFont(HWND hwnd, LPTSTR lpstrFontName)
{
Dbg(("PadListView_SetHeaderFont START\n"));
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
INT point = 9;
if(!lpPlvData) {
Dbg(("PadListView_SetHeaderFont ERROR\n"));
return 0;
}
HFONT hFont;
::ZeroMemory(&g_logFont, sizeof(g_logFont));
HDC hDC = ::GetDC(hwnd);
INT dpi = ::GetDeviceCaps(hDC, LOGPIXELSY);
if(-1 == GetLogFont(hDC, lpstrFontName, &g_logFont)) {
::ReleaseDC(hwnd, hDC);
return -1;
}
::ReleaseDC(hwnd, hDC);
g_logFont.lfHeight = - (point * dpi)/72;
g_logFont.lfWidth = 0;
hFont = CreateFontIndirect(&g_logFont);
if(!hFont) {
Dbg(("CreatFontIndirect Error\n"));
return -1;
}
if(lpPlvData->hFontHeader) {
::DeleteObject(lpPlvData->hFontHeader);
}
lpPlvData->hFontHeader = hFont;
return 0;
}
//////////////////////////////////////////////////////////////////
// Function : PadListView_SetCodePage
// Type : INT WINAPI
// Purpose :
// Args :
// : HWND hwnd
// : INT codePage
// Return :
// DATE : Tue Jul 28 08:59:35 1998
// Histroy :
//////////////////////////////////////////////////////////////////
INT WINAPI PadListView_SetCodePage(HWND hwnd, INT codePage)
{
Dbg(("PadListView_SetCodePage START\n"));
LPPLVDATA lpPlvData = GetPlvDataFromHWND(hwnd);
if(lpPlvData) {
lpPlvData->codePage = codePage;
}
return 0;
}
#ifdef MSAA
//////////////////////////////////////////////////////////////////
// Functions : MSAA Support Functions
// DATE : 980724
//////////////////////////////////////////////////////////////////
BOOL PLV_InitMSAA(LPPLVDATA lpPlv)
{
if(!lpPlv)
return FALSE;
lpPlv->bMSAAAvailable = FALSE;
lpPlv->bCoInitialized = FALSE;
lpPlv->hOleAcc = NULL;
lpPlv->pfnLresultFromObject = NULL;
#ifdef NOTUSED
lpPlv->pfnObjectFromLresult = NULL;
lpPlv->pfnAccessibleObjectFromWindow = NULL;
lpPlv->pfnAccessibleObjectFromPoint = NULL;
#endif
lpPlv->pfnCreateStdAccessibleObject = NULL;
#ifdef NOTUSED
lpPlv->pfnAccessibleChildren = NULL;
#endif
lpPlv->hUser32 = NULL;
lpPlv->pfnNotifyWinEvent=NULL;
lpPlv->bReadyForWMGetObject=FALSE;
lpPlv->pAccPLV = NULL;
if(!PLV_LoadOleAccForMSAA(lpPlv))
return FALSE;
if(!PLV_LoadUser32ForMSAA(lpPlv)){
PLV_UnloadOleAccForMSAA(lpPlv);
return FALSE;
}
if(!PLV_CoInitialize(lpPlv)){
PLV_UnloadUser32ForMSAA(lpPlv);
PLV_UnloadOleAccForMSAA(lpPlv);
return FALSE;
}
lpPlv->bMSAAAvailable = TRUE;
return TRUE;
}
void PLV_UninitMSAA(LPPLVDATA lpPlv)
{
if(!lpPlv)
return;
if(lpPlv->bMSAAAvailable){
PLV_CoUninitialize(lpPlv);
PLV_UnloadUser32ForMSAA(lpPlv);
PLV_UnloadOleAccForMSAA(lpPlv);
lpPlv->bMSAAAvailable = FALSE;
}
}
BOOL PLV_CoInitialize(LPPLVDATA lpPlv)
{
if(lpPlv && !lpPlv->bCoInitialized &&
SUCCEEDED(CoInitialize(NULL)))
lpPlv->bCoInitialized = TRUE;
return lpPlv->bCoInitialized;
}
void PLV_CoUninitialize(LPPLVDATA lpPlv)
{
if(lpPlv && lpPlv->bCoInitialized){
CoUninitialize();
lpPlv->bCoInitialized = FALSE;
}
}
BOOL PLV_LoadOleAccForMSAA(LPPLVDATA lpPlv)
{
if(!lpPlv)
return FALSE;
lpPlv->hOleAcc=::LoadLibrary("oleacc.dll");
if(!lpPlv->hOleAcc)
return FALSE;
if((lpPlv->pfnLresultFromObject
=(LPFNLRESULTFROMOBJECT)::GetProcAddress(lpPlv->hOleAcc,"LresultFromObject"))
#ifdef NOTUSED
&& (lpPlv->pfnObjectFromLresult
=(LPFNOBJECTFROMLRESULT)::GetProcAddress(lpPlv->hOleAcc,"ObjectFromLresult"))
&& (lpPlv->pfnAccessibleObjectFromWindow
=(LPFNACCESSIBLEOBJECTFROMWINDOW)::GetProcAddress(lpPlv->hOleAcc,"AccessibleObjectFromWindow"))
&& (lpPlv->pfnAccessibleObjectFromPoint
=(LPFNACCESSIBLEOBJECTFROMPOINT)::GetProcAddress(lpPlv->hOleAcc,"AccessibleObjectFromPoint"))
#endif
&& (lpPlv->pfnCreateStdAccessibleObject
=(LPFNCREATESTDACCESSIBLEOBJECT)::GetProcAddress(lpPlv->hOleAcc,"CreateStdAccessibleObject"))
#ifdef NOTUSED
&& (lpPlv->pfnAccessibleChildren
=(LPFNACCESSIBLECHILDREN)::GetProcAddress(lpPlv->hOleAcc,"CreateAccessibleChildren"))
#endif
)
return TRUE;
PLV_UnloadOleAccForMSAA(lpPlv);
return FALSE;
}
void PLV_UnloadOleAccForMSAA(LPPLVDATA lpPlv)
{
if(!lpPlv)
return;
if(lpPlv->hOleAcc){
::FreeLibrary(lpPlv->hOleAcc);
lpPlv->hOleAcc = NULL;
}
lpPlv->pfnLresultFromObject=NULL;
#ifdef NOTUSED
lpPlv->pfnObjectFromLresult=NULL;
lpPlv->pfnAccessibleObjectFromWindow=NULL;
lpPlv->pfnAccessibleObjectFromPoint=NULL;
#endif
lpPlv->pfnCreateStdAccessibleObject=NULL;
#ifdef NOTUSED
lpPlv->pfnAccessibleChildren=NULL;
#endif
}
BOOL PLV_LoadUser32ForMSAA(LPPLVDATA lpPlv)
{
if(!lpPlv)
return FALSE;
lpPlv->hUser32=::LoadLibrary("user32.dll");
if(!lpPlv->hUser32)
return FALSE;
if((lpPlv->pfnNotifyWinEvent
=(LPFNNOTIFYWINEVENT)::GetProcAddress(lpPlv->hUser32,"NotifyWinEvent")))
return TRUE;
PLV_UnloadUser32ForMSAA(lpPlv);
return FALSE;
}
void PLV_UnloadUser32ForMSAA(LPPLVDATA lpPlv)
{
if(!lpPlv)
return;
if(lpPlv->hUser32){
::FreeLibrary(lpPlv->hUser32);
lpPlv->hUser32 = NULL;
}
lpPlv->pfnNotifyWinEvent = NULL;
}
BOOL PLV_IsMSAAAvailable(LPPLVDATA lpPlv)
{
return (lpPlv && lpPlv->bMSAAAvailable);
}
LRESULT PLV_LresultFromObject(LPPLVDATA lpPlv,REFIID riid, WPARAM wParam, LPUNKNOWN punk)
{
if(lpPlv && lpPlv->pfnLresultFromObject)
return lpPlv->pfnLresultFromObject(riid, wParam, punk);
return (LRESULT)E_FAIL;
}
#ifdef NOTUSED
HRESULT PLV_ObjectFromLresult(LPPLVDATA lpPlv,LRESULT lResult, REFIID riid, WPARAM wParam, void** ppvObject)
{
if(lpPlv && lpPlv->pfnObjectFromLresult)
return lpPlv->pfnObjectFromLresult(lResult, riid, wParam, ppvObject);
return E_FAIL;
}
HRESULT PLV_AccessibleObjectFromWindow(LPPLVDATA lpPlv,HWND hwnd, DWORD dwId, REFIID riid, void **ppvObject)
{
if(lpPlv && lpPlv->pfnAccessibleObjectFromWindow)
return lpPlv->pfnAccessibleObjectFromWindow(hwnd, dwId, riid, ppvObject);
return E_FAIL;
}
HRESULT PLV_AccessibleObjectFromPoint(LPPLVDATA lpPlv,POINT ptScreen, IAccessible ** ppacc, VARIANT* pvarChild)
{
if(lpPlv && lpPlv->pfnAccessibleObjectFromPoint)
return lpPlv->pfnAccessibleObjectFromPoint(ptScreen, ppacc, pvarChild);
return E_FAIL;
}
#endif // NOTUSED
HRESULT PLV_CreateStdAccessibleObject(LPPLVDATA lpPlv,HWND hwnd, LONG idObject, REFIID riid, void** ppvObject)
{
if(lpPlv && lpPlv->pfnCreateStdAccessibleObject)
return lpPlv->pfnCreateStdAccessibleObject(hwnd, idObject, riid, ppvObject);
return E_FAIL;
}
#ifdef NOTUSED
HRESULT PLV_AccessibleChildren (LPPLVDATA lpPlv,IAccessible* paccContainer, LONG iChildStart,
LONG cChildren, VARIANT* rgvarChildren,LONG* pcObtained)
{
if(lpPlv && lpPlv->pfnAccessibleChildren)
return lpPlv->pfnAccessibleChildren (paccContainer, iChildStart,cChildren,
rgvarChildren, pcObtained);
return E_FAIL;
}
#endif
void PLV_NotifyWinEvent(LPPLVDATA lpPlv,DWORD event,HWND hwnd ,LONG idObject,LONG idChild)
{
if(lpPlv && lpPlv->pfnNotifyWinEvent)
lpPlv->pfnNotifyWinEvent(event,hwnd,idObject,idChild);
}
INT PLV_ChildIDFromPoint(LPPLVDATA lpPlv,POINT pt)
{
if(!lpPlv)
return -1;
static INT index,nCol,nWid;
static PLVINFO plvInfo;
static HD_ITEM hdItem;
if(lpPlv->dwStyle == PLVSTYLE_ICON) // iconview
index = IV_GetInfoFromPoint(lpPlv, pt, &plvInfo);
else { // report view
nCol = RV_GetColumn(lpPlv);
index = RV_GetInfoFromPoint(lpPlv, pt, &plvInfo);
if(index < 0) {
if(pt.y > RV_GetHeaderHeight(lpPlv)) // out of header
return -1;
// header
nWid = 0;
hdItem.mask = HDI_WIDTH;
hdItem.fmt = 0;
for(index = 0;index<nCol;index++){
Header_GetItem(lpPlv->hwndHeader,index,&hdItem);
nWid += hdItem.cxy;
if(pt.x <= nWid)
break;
}
}
else
index = (index + 1) * nCol + plvInfo.colIndex;
}
return index + 1; // 1 origin
}
#endif // MSAA