3 * Copyright (C) 2004 ReactOS Team
4 * Copyright (C) 2004 GkWare e.K.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /* $Id: control.c,v 1.2 2004/06/28 12:05:16 ekohl Exp $
22 * PROJECT: ReactOS System Control Panel
23 * FILE: lib/cpl/system/control.c
24 * PURPOSE: ReactOS System Control Panel
25 * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com)
42 //#define CONTROL_DEBUG_ENABLE
44 #ifdef CONTROL_DEBUG_ENABLE
45 #define CTL_DEBUG(x) dbgprint x
51 #define MYWNDCLASS _T("CTLPANELCLASS")
53 typedef LONG (CALLBACK
*CPLAPPLETFUNC
)(HWND hwndCPL
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
);
55 typedef struct CPLLISTENTRY
57 TCHAR pszPath
[MAX_PATH
];
69 void dbgprint(TCHAR
*format
,...)
74 _vstprintf(buf
,format
,va
);
75 OutputDebugString(buf
);
79 void PopulateCPLList(HWND hLisCtrl
)
83 TCHAR pszSearchPath
[MAX_PATH
];
84 HIMAGELIST hImgListSmall
;
85 HIMAGELIST hImgListLarge
;
86 GetSystemDirectory(pszSearchPath
,MAX_PATH
);
87 _tcscat(pszSearchPath
,_T("\\*.cpl"));
88 hFind
= FindFirstFile(pszSearchPath
,&fd
);
89 hImgListSmall
= ImageList_Create(16,16,ILC_COLOR
,256,1000);
90 hImgListLarge
= ImageList_Create(32,32,ILC_COLOR
,256,1000);
91 while(hFind
!= INVALID_HANDLE_VALUE
)
94 CTL_DEBUG((_T("Found %s\r\n"),fd
.cFileName
));
95 pEntry
= (CPLLISTENTRY
*)malloc(sizeof(CPLLISTENTRY
));
98 _tcscpy(pEntry
->pszPath
,pszSearchPath
);
99 *_tcsrchr(pEntry
->pszPath
,'\\')=0;
100 _tcscat(pEntry
->pszPath
,_T("\\"));
101 _tcscat(pEntry
->pszPath
,fd
.cFileName
);
103 pEntry
->hDLL
= LoadLibrary(pEntry
->pszPath
);
104 CTL_DEBUG((_T("Handle %08X\r\n"),pEntry
->hDLL
));
105 pEntry
->pFunc
= (CPLAPPLETFUNC
)GetProcAddress(pEntry
->hDLL
,"CPlApplet");
106 CTL_DEBUG((_T("CPLFunc %08X\r\n"),pEntry
->pFunc
));
107 if(pEntry
->pFunc
&& pEntry
->pFunc(hLisCtrl
,CPL_INIT
,0,0))
110 for(i
=0;i
<pEntry
->pFunc(hLisCtrl
,CPL_GETCOUNT
,0,0);i
++)
113 TCHAR Name
[MAX_PATH
];
115 pEntry
->pFunc(hLisCtrl
,CPL_INQUIRE
,0,(LPARAM
)&pEntry
->CPLInfo
);
117 hIcon
= LoadIcon(pEntry
->hDLL
,MAKEINTRESOURCE(pEntry
->CPLInfo
.idIcon
));
118 index
= ImageList_AddIcon(hImgListSmall
,hIcon
);
119 ImageList_AddIcon(hImgListLarge
,hIcon
);
122 LoadString(pEntry
->hDLL
,pEntry
->CPLInfo
.idName
,Name
,MAX_PATH
);
127 memset(&lvi
,0x00,sizeof(lvi
));
128 lvi
.mask
=LVIF_TEXT
|LVIF_PARAM
|LVIF_STATE
|LVIF_IMAGE
;
132 lvi
.lParam
= (LPARAM
)pEntry
;
133 pEntry
->nIndex
= ListView_InsertItem(hLisCtrl
,&lvi
);
135 LoadString(pEntry
->hDLL
,pEntry
->CPLInfo
.idInfo
,Name
,MAX_PATH
);
136 ListView_SetItemText(hLisCtrl
,pEntry
->nIndex
,1,Name
);
138 ListView_SetImageList(hLisCtrl
,hImgListSmall
,LVSIL_SMALL
);
139 ListView_SetImageList(hLisCtrl
,hImgListLarge
,LVSIL_NORMAL
);
144 if(!FindNextFile(hFind
,&fd
))
145 hFind
= INVALID_HANDLE_VALUE
;
149 LRESULT CALLBACK
MyWindowProc(HWND hWnd
,UINT uMsg
,WPARAM wParam
,LPARAM lParam
)
157 GetClientRect(hWnd
,&rect
);
158 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);
159 CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView
));
161 memset(&column
,0x00,sizeof(column
));
162 column
.mask
=LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
|LVCF_TEXT
;
163 column
.fmt
=LVCFMT_LEFT
;
164 column
.cx
= (rect
.right
- rect
.left
) / 3;
166 column
.pszText
= _T("Name");
167 ListView_InsertColumn(hListView
,0,&column
);
168 column
.cx
= (rect
.right
- rect
.left
) - ((rect
.right
- rect
.left
) / 3) - 1;
170 column
.pszText
= _T("Comment");
171 ListView_InsertColumn(hListView
,1,&column
);
172 PopulateCPLList(hListView
);
173 ListView_SetColumnWidth(hListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
174 ListView_Update(hListView
,0);
183 GetClientRect(hWnd
,&rect
);
184 MoveWindow(hListView
,0,0,rect
.right
,rect
.bottom
,TRUE
);
190 phdr
= (NMHDR
*)lParam
;
197 CPLLISTENTRY
*pEntry
;
198 nSelect
=SendMessage(hListView
,LVM_GETNEXTITEM
,(WPARAM
)-1,LVNI_FOCUSED
);
200 if(nSelect
==-1) // no items
202 MessageBox(hWnd
,_T("No Items in ListView"),_T("Error"),MB_OK
|MB_ICONINFORMATION
);
205 CTL_DEBUG((_T("Select %d\r\n"),nSelect
));
206 memset(&lvi
,0x00,sizeof(lvi
));
208 lvi
.mask
= LVIF_PARAM
;
209 ListView_GetItem(hListView
,&lvi
);
210 pEntry
= (CPLLISTENTRY
*)lvi
.lParam
;
211 CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry
));
213 CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry
->pFunc
));
215 if(pEntry
&& pEntry
->pFunc
)
216 pEntry
->pFunc(hListView
,CPL_DBLCLK
,pEntry
->CPLInfo
.lData
,0);
222 switch(LOWORD(wParam
))
225 SetWindowLong(hListView
,GWL_STYLE
,LVS_ICON
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
228 SetWindowLong(hListView
,GWL_STYLE
,LVS_SMALLICON
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
231 SetWindowLong(hListView
,GWL_STYLE
,LVS_LIST
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
234 SetWindowLong(hListView
,GWL_STYLE
,LVS_REPORT
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
240 MessageBox(hWnd
,_T("Simple Control Panel (not Shell-namespace based)\rCopyright 2004 GkWare e.K.\rhttp://www.gkware.com\rReleased under the GPL"),_T("About the Control Panel"),MB_OK
| MB_ICONINFORMATION
);
245 return DefWindowProc(hWnd
,uMsg
,wParam
,lParam
);
251 int WINAPI
wWinMain(HINSTANCE hInstance
,HINSTANCE hPrevInstance
,WCHAR
*lpCmdLine
,int nCmdShow
)
253 int WINAPI
WinMain(HINSTANCE hInstance
,HINSTANCE hPrevInstance
,char *lpCmdLine
,int nCmdShow
)
259 CTL_DEBUG((_T("My Control Panel\r\n")));
260 memset(&wc
,0x00,sizeof(wc
));
261 wc
.hIcon
= LoadIcon(hInst
,MAKEINTRESOURCE(IDI_MAINICON
));
262 wc
.lpszClassName
= MYWNDCLASS
;
263 wc
.lpszMenuName
= _T("MAINMENU");
264 wc
.lpfnWndProc
= MyWindowProc
;
266 InitCommonControls();
267 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);
269 CTL_DEBUG((_T("Unable to create window\r\n")));
272 ShowWindow(hMainWnd
,nCmdShow
);
273 while(GetMessage(&msg
,0,0,0))
275 TranslateMessage(&msg
);
276 DispatchMessage(&msg
);