- Support control panel applications that provide more than one control panel.

- Clean-up to improve readability.

svn path=/trunk/; revision=11468
This commit is contained in:
Eric Kohl 2004-10-29 12:27:58 +00:00
parent d338969f54
commit f776678f2d

View file

@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: control.c,v 1.5 2004/09/15 16:03:09 fireball Exp $ /* $Id: control.c,v 1.6 2004/10/29 12:27:58 ekohl Exp $
* *
* PROJECT: ReactOS System Control Panel * PROJECT: ReactOS System Control Panel
* FILE: lib/cpl/system/control.c * FILE: lib/cpl/system/control.c
@ -52,11 +52,11 @@ typedef LONG (CALLBACK *CPLAPPLETFUNC)(HWND hwndCPL, UINT uMsg, LPARAM lParam1,
typedef struct CPLLISTENTRY typedef struct CPLLISTENTRY
{ {
TCHAR pszPath[MAX_PATH]; TCHAR pszPath[MAX_PATH];
HMODULE hDLL; HMODULE hDll;
CPLAPPLETFUNC pFunc; CPLAPPLETFUNC pFunc;
CPLINFO CPLInfo; CPLINFO CplInfo;
int nIndex; int nIndex;
} CPLLISTENTRY; } CPLLISTENTRY, *PCPLLISTENTRY;
HWND hListView; HWND hListView;
@ -64,116 +64,130 @@ HINSTANCE hInst;
HWND hMainWnd; HWND hMainWnd;
DEVMODE pDevMode; DEVMODE pDevMode;
void dbgprint(TCHAR *format,...) VOID dbgprint(TCHAR *format,...)
{ {
TCHAR buf[1000]; TCHAR buf[1000];
va_list va; va_list va;
va_start(va,format); va_start(va,format);
_vstprintf(buf,format,va); _vstprintf(buf,format,va);
OutputDebugString(buf); OutputDebugString(buf);
va_end(va); va_end(va);
} }
void PopulateCPLList(HWND hLisCtrl) VOID PopulateCPLList(HWND hLisCtrl)
{ {
WIN32_FIND_DATA fd; WIN32_FIND_DATA fd;
HANDLE hFind; HANDLE hFind;
TCHAR pszSearchPath[MAX_PATH]; TCHAR pszSearchPath[MAX_PATH];
HIMAGELIST hImgListSmall; HIMAGELIST hImgListSmall;
HIMAGELIST hImgListLarge; HIMAGELIST hImgListLarge;
int C_Depth; int ColorDepth;
HMODULE hDll;
CPLAPPLETFUNC pFunc;
TCHAR pszPath[MAX_PATH];
GetSystemDirectory(pszSearchPath,MAX_PATH); /* Icon drawing mode */
_tcscat(pszSearchPath,_T("\\*.cpl"));
hFind = FindFirstFile(pszSearchPath,&fd);
/* Icon drawing mode */
pDevMode.dmSize = sizeof(DEVMODE); pDevMode.dmSize = sizeof(DEVMODE);
pDevMode.dmDriverExtra = 0; pDevMode.dmDriverExtra = 0;
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&pDevMode); EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&pDevMode);
switch(pDevMode.dmBitsPerPel) switch (pDevMode.dmBitsPerPel)
{ {
case 32: C_Depth = ILC_COLOR32; break; case 32: ColorDepth = ILC_COLOR32; break;
case 24: C_Depth = ILC_COLOR24; break; case 24: ColorDepth = ILC_COLOR24; break;
case 16: C_Depth = ILC_COLOR16; break; case 16: ColorDepth = ILC_COLOR16; break;
case 8: C_Depth = ILC_COLOR8; break; case 8: ColorDepth = ILC_COLOR8; break;
case 4: C_Depth = ILC_COLOR4; break; case 4: ColorDepth = ILC_COLOR4; break;
default: C_Depth = ILC_COLOR; break; default: ColorDepth = ILC_COLOR; break;
} }
hImgListSmall = ImageList_Create(16,16,C_Depth | ILC_MASK,256,1000); hImgListSmall = ImageList_Create(16,16,ColorDepth | ILC_MASK,5,5);
hImgListLarge = ImageList_Create(32,32,C_Depth | ILC_MASK,256,1000); hImgListLarge = ImageList_Create(32,32,ColorDepth | ILC_MASK,5,5);
GetSystemDirectory(pszSearchPath,MAX_PATH);
_tcscat(pszSearchPath,_T("\\*.cpl"));
while(hFind != INVALID_HANDLE_VALUE) hFind = FindFirstFile(pszSearchPath,&fd);
while (hFind != INVALID_HANDLE_VALUE)
{ {
CPLLISTENTRY *pEntry; PCPLLISTENTRY pEntry;
CTL_DEBUG((_T("Found %s\r\n"),fd.cFileName)); CTL_DEBUG((_T("Found %s\r\n"), fd.cFileName));
pEntry = (CPLLISTENTRY*)malloc(sizeof(CPLLISTENTRY));
if(!pEntry)
break;
_tcscpy(pEntry->pszPath,pszSearchPath);
*_tcsrchr(pEntry->pszPath,'\\')=0;
_tcscat(pEntry->pszPath,_T("\\"));
_tcscat(pEntry->pszPath,fd.cFileName);
pEntry->hDLL = LoadLibrary(pEntry->pszPath); _tcscpy(pszPath, pszSearchPath);
CTL_DEBUG((_T("Handle %08X\r\n"),pEntry->hDLL)); *_tcsrchr(pszPath, '\\')=0;
pEntry->pFunc = (CPLAPPLETFUNC)GetProcAddress(pEntry->hDLL,"CPlApplet"); _tcscat(pszPath, _T("\\"));
CTL_DEBUG((_T("CPLFunc %08X\r\n"),pEntry->pFunc)); _tcscat(pszPath, fd.cFileName);
if(pEntry->pFunc && pEntry->pFunc(hLisCtrl,CPL_INIT,0,0))
hDll = LoadLibrary(pszPath);
CTL_DEBUG((_T("Handle %08X\r\n"), hDll));
pFunc = (CPLAPPLETFUNC)GetProcAddress(hDll, "CPlApplet");
CTL_DEBUG((_T("CPLFunc %08X\r\n"), pFunc));
if (pFunc && pFunc(hLisCtrl, CPL_INIT, 0, 0))
{ {
int i; UINT i, uPanelCount;
for(i=0;i<pEntry->pFunc(hLisCtrl,CPL_GETCOUNT,0,0);i++)
uPanelCount = (UINT)pFunc(hLisCtrl, CPL_GETCOUNT, 0, 0);
for (i = 0; i < uPanelCount; i++)
{ {
HICON hIcon; HICON hIcon;
TCHAR Name[MAX_PATH]; TCHAR Name[MAX_PATH];
int index; int index;
pEntry->pFunc(hLisCtrl,CPL_INQUIRE,0,(LPARAM)&pEntry->CPLInfo);
hIcon = LoadImage(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); pEntry = (PCPLLISTENTRY)malloc(sizeof(CPLLISTENTRY));
if (pEntry == NULL)
return;
memset(pEntry, 0, sizeof(CPLLISTENTRY));
pEntry->hDll = hDll;
pEntry->pFunc = pFunc;
_tcscpy(pEntry->pszPath, pszPath);
pEntry->pFunc(hLisCtrl, CPL_INQUIRE, (LPARAM)i, (LPARAM)&pEntry->CplInfo);
hIcon = LoadImage(pEntry->hDll,MAKEINTRESOURCE(pEntry->CplInfo.idIcon),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
index = ImageList_AddIcon(hImgListSmall,hIcon); index = ImageList_AddIcon(hImgListSmall,hIcon);
DestroyIcon(hIcon); DestroyIcon(hIcon);
hIcon = LoadImage(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon),IMAGE_ICON,32,32,LR_DEFAULTCOLOR); hIcon = LoadImage(pEntry->hDll,MAKEINTRESOURCE(pEntry->CplInfo.idIcon),IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
ImageList_AddIcon(hImgListLarge,hIcon); ImageList_AddIcon(hImgListLarge,hIcon);
DestroyIcon(hIcon); DestroyIcon(hIcon);
LoadString(pEntry->hDLL,pEntry->CPLInfo.idName,Name,MAX_PATH); if (LoadString(pEntry->hDll, pEntry->CplInfo.idName, Name, MAX_PATH))
if(_tcslen(Name))
{ {
LV_ITEM lvi; LV_ITEM lvi;
memset(&lvi,0x00,sizeof(lvi)); memset(&lvi,0x00,sizeof(lvi));
lvi.mask=LVIF_TEXT|LVIF_PARAM|LVIF_STATE|LVIF_IMAGE; lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_STATE|LVIF_IMAGE;
lvi.pszText = Name; lvi.pszText = Name;
lvi.state=0; lvi.state = 0;
lvi.iImage=index; lvi.iImage = index;
lvi.lParam = (LPARAM)pEntry; lvi.lParam = (LPARAM)pEntry;
pEntry->nIndex = ListView_InsertItem(hLisCtrl,&lvi); pEntry->nIndex = ListView_InsertItem(hLisCtrl,&lvi);
LoadString(pEntry->hDLL,pEntry->CPLInfo.idInfo,Name,MAX_PATH); if (LoadString(pEntry->hDll, pEntry->CplInfo.idInfo, Name, MAX_PATH))
ListView_SetItemText(hLisCtrl,pEntry->nIndex,1,Name); ListView_SetItemText(hLisCtrl, pEntry->nIndex, 1, Name);
}
}
}
if (!FindNextFile(hFind,&fd))
hFind = INVALID_HANDLE_VALUE;
}
ListView_SetImageList(hLisCtrl,hImgListSmall,LVSIL_SMALL); ListView_SetImageList(hLisCtrl,hImgListSmall,LVSIL_SMALL);
ListView_SetImageList(hLisCtrl,hImgListLarge,LVSIL_NORMAL); ListView_SetImageList(hLisCtrl,hImgListLarge,LVSIL_NORMAL);
}
}
}
if(!FindNextFile(hFind,&fd))
hFind = INVALID_HANDLE_VALUE;
}
} }
LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{ {
switch(uMsg) switch (uMsg)
{ {
case WM_CREATE: case WM_CREATE:
{ {
RECT rect; RECT rect;
LV_COLUMN column; LV_COLUMN column;
GetClientRect(hWnd,&rect); GetClientRect(hWnd,&rect);
hListView = CreateWindow(WC_LISTVIEW,_T(""),LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_TABSTOP,0,0,rect.right ,rect.bottom,hWnd,NULL,hInst,0); hListView = CreateWindow(WC_LISTVIEW,_T(""),LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_TABSTOP,0,0,rect.right ,rect.bottom,hWnd,NULL,hInst,0);
CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView)); CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView));
@ -192,54 +206,67 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
PopulateCPLList(hListView); PopulateCPLList(hListView);
ListView_SetColumnWidth(hListView,2,LVSCW_AUTOSIZE_USEHEADER); ListView_SetColumnWidth(hListView,2,LVSCW_AUTOSIZE_USEHEADER);
ListView_Update(hListView,0); ListView_Update(hListView,0);
SetFocus(hListView);
} }
break; break;
case WM_DESTROY: case WM_DESTROY:
PostQuitMessage(0); PostQuitMessage(0);
break; break;
case WM_SIZE: case WM_SIZE:
{ {
RECT rect; RECT rect;
GetClientRect(hWnd,&rect); GetClientRect(hWnd,&rect);
MoveWindow(hListView,0,0,rect.right,rect.bottom,TRUE); MoveWindow(hListView,0,0,rect.right,rect.bottom,TRUE);
} }
break; break;
case WM_NOTIFY: case WM_NOTIFY:
{ {
NMHDR *phdr; NMHDR *phdr;
phdr = (NMHDR*)lParam; phdr = (NMHDR*)lParam;
switch(phdr->code) switch(phdr->code)
{ {
case NM_RETURN:
case NM_DBLCLK: case NM_DBLCLK:
{ {
int nSelect; int nSelect;
LV_ITEM lvi; LV_ITEM lvi;
CPLLISTENTRY *pEntry; PCPLLISTENTRY pEntry;
nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED); nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED);
if(nSelect==-1) // no items if (nSelect==-1)
{ {
/* no items */
MessageBox(hWnd,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION); MessageBox(hWnd,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION);
break; break;
} }
CTL_DEBUG((_T("Select %d\r\n"),nSelect)); CTL_DEBUG((_T("Select %d\r\n"),nSelect));
memset(&lvi,0x00,sizeof(lvi)); memset(&lvi,0x00,sizeof(lvi));
lvi.iItem = nSelect; lvi.iItem = nSelect;
lvi.mask = LVIF_PARAM; lvi.mask = LVIF_PARAM;
ListView_GetItem(hListView,&lvi); ListView_GetItem(hListView,&lvi);
pEntry = (CPLLISTENTRY *)lvi.lParam; pEntry = (PCPLLISTENTRY)lvi.lParam;
CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry)); CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry));
if(pEntry) { if (pEntry)
{
CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry->pFunc)); CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry->pFunc));
} }
if(pEntry && pEntry->pFunc)
pEntry->pFunc(hListView,CPL_DBLCLK,pEntry->CPLInfo.lData,0); if (pEntry && pEntry->pFunc)
pEntry->pFunc(hListView,CPL_DBLCLK,pEntry->CplInfo.lData,0);
} }
} }
} }
break; break;
case WM_COMMAND: case WM_COMMAND:
switch(LOWORD(wParam)) switch (LOWORD(wParam))
{ {
case IDM_LARGEICONS: case IDM_LARGEICONS:
SetWindowLong(hListView,GWL_STYLE,LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); SetWindowLong(hListView,GWL_STYLE,LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP);
@ -261,12 +288,15 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
break; break;
} }
break; break;
default: default:
return DefWindowProc(hWnd,uMsg,wParam,lParam); return DefWindowProc(hWnd,uMsg,wParam,lParam);
} }
return 0; return 0;
} }
#ifdef _MSVC #ifdef _MSVC
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,WCHAR *lpCmdLine,int nCmdShow) int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,WCHAR *lpCmdLine,int nCmdShow)
#else #else
@ -275,6 +305,7 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,i
{ {
MSG msg; MSG msg;
WNDCLASS wc; WNDCLASS wc;
hInst = hInstance; hInst = hInstance;
CTL_DEBUG((_T("My Control Panel\r\n"))); CTL_DEBUG((_T("My Control Panel\r\n")));
memset(&wc,0x00,sizeof(wc)); memset(&wc,0x00,sizeof(wc));
@ -285,12 +316,13 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,i
RegisterClass(&wc); RegisterClass(&wc);
InitCommonControls(); InitCommonControls();
hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE,MYWNDCLASS,_T("Control Panel"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(hInst,MAKEINTRESOURCE(IDM_MAINMENU)),hInst,0); hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE,MYWNDCLASS,_T("Control Panel"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(hInst,MAKEINTRESOURCE(IDM_MAINMENU)),hInst,0);
if(!hMainWnd) { if (!hMainWnd)
{
CTL_DEBUG((_T("Unable to create window\r\n"))); CTL_DEBUG((_T("Unable to create window\r\n")));
return -1; return -1;
} }
ShowWindow(hMainWnd,nCmdShow); ShowWindow(hMainWnd,nCmdShow);
while(GetMessage(&msg,0,0,0)) while (GetMessage(&msg,0,0,0))
{ {
TranslateMessage(&msg); TranslateMessage(&msg);
DispatchMessage(&msg); DispatchMessage(&msg);