3 * PROJECT: ReactOS Software Control Panel
4 * FILE: dll/cpl/appwiz/appwiz.c
5 * PURPOSE: ReactOS Software Control Panel
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
13 WCHAR
* DescriptionHeadline
= L
"";
14 WCHAR
* DescriptionText
= L
"";
16 WCHAR Strings
[2][256];
18 HTREEITEM hRootItem
; // First item in actions list
20 HIMAGELIST hImageAppList
; // Image list for programs list
21 BOOL bAscending
= TRUE
; // Sorting programs list
23 HDC BackbufferHdc
= NULL
;
24 HBITMAP BackbufferBmp
= NULL
;
28 ShowMessage(WCHAR
* title
, WCHAR
* message
)
30 DescriptionHeadline
= title
;
31 DescriptionText
= message
;
32 InvalidateRect(hMainWnd
,NULL
,TRUE
);
33 UpdateWindow(hMainWnd
);
37 DrawBitmap(HDC hdc
, int x
, int y
, HBITMAP hBmp
)
40 HDC hdcMem
= CreateCompatibleDC(hdc
);
42 SelectObject(hdcMem
, hBmp
);
43 GetObject(hBmp
, sizeof(bm
), &bm
);
44 TransparentBlt(hdc
, x
, y
, bm
.bmWidth
, bm
.bmHeight
, hdcMem
, 0, 0, bm
.bmWidth
, bm
.bmHeight
, 0xFFFFFF);
50 DrawDescription(HDC hdc
, RECT DescriptionRect
)
54 RECT Rect
= {DescriptionRect
.left
+5, DescriptionRect
.top
+5, DescriptionRect
.right
-2, DescriptionRect
.top
+22};
57 Rectangle(hdc
, DescriptionRect
.left
, DescriptionRect
.top
, DescriptionRect
.right
, DescriptionRect
.bottom
);
60 for (i
=DescriptionRect
.left
+1;i
<DescriptionRect
.right
-1;i
++)
61 DrawBitmap(hdc
, i
, DescriptionRect
.top
+22, hUnderline
); // less code then stretching ;)
64 Font
= CreateFont(-14, 0, 0, 0, FW_EXTRABOLD
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
65 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_DONTCARE
, L
"Arial");
66 SelectObject(hdc
, Font
);
67 DrawText(hdc
, DescriptionHeadline
, lstrlen(DescriptionHeadline
), &Rect
, DT_SINGLELINE
|DT_NOPREFIX
);
71 Font
= CreateFont(-11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
72 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_DONTCARE
, L
"Arial");
73 SelectObject(hdc
, Font
);
75 Rect
.bottom
= DescriptionRect
.bottom
-2;
76 DrawText(hdc
, DescriptionText
, lstrlen(DescriptionText
), &Rect
, DT_WORDBREAK
|DT_NOPREFIX
); // ToDo: Call TabbedTextOut to draw a nice table
81 ResizeControl(HWND hwnd
, int x1
, int y1
, int x2
, int y2
)
83 MoveWindow(hwnd
, x1
, y1
, x2
-x1
, y2
-y1
, TRUE
);
87 AddListColumn - adding column items to Application list
94 WCHAR szBuf
[MAX_PATH
];
96 GetClientRect(hMainWnd
, &rect
);
97 ZeroMemory(&column
, sizeof(LV_COLUMN
));
98 column
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_WIDTH
| LVCF_SUBITEM
;
99 column
.fmt
= LVCFMT_LEFT
;
101 LoadString(hApplet
, IDS_LIST_TITLE
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
102 column
.pszText
= szBuf
;
104 (void)ListView_InsertColumn(hAppList
, 0, &column
);
108 LoadString(hApplet
, IDS_LAST_USED
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
109 column
.pszText
= szBuf
;
110 (void)ListView_InsertColumn(hAppList
,1,&column
);
114 column
.fmt
= LVCFMT_RIGHT
;
115 LoadString(hApplet
, IDS_SIZE_TITLE
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
116 column
.pszText
= szBuf
;
117 (void)ListView_InsertColumn(hAppList
,2,&column
);
121 AddTreeViewItems(VOID
)
123 HIMAGELIST hImageList
;
126 TV_INSERTSTRUCTW Insert
;
128 hImageList
= ImageList_Create(16, 16, ILC_COLORDDB
, 1, 1);
129 SendMessageW(hActList
, TVM_SETIMAGELIST
, TVSIL_NORMAL
, (LPARAM
)(HIMAGELIST
)hImageList
);
131 Index
[0] = ImageList_Add(hImageList
, LoadBitmap(hApplet
, MAKEINTRESOURCE(IDB_SELECT
)), NULL
);
132 Index
[1] = ImageList_Add(hImageList
, LoadBitmap(hApplet
, MAKEINTRESOURCE(IDB_ICON
)), NULL
);
134 // Insert items to Actions List
135 ZeroMemory(&Insert
, sizeof(TV_INSERTSTRUCT
));
136 Insert
.item
.mask
= TVIF_TEXT
|TVIF_PARAM
|TVIF_IMAGE
|TVIF_SELECTEDIMAGE
;
137 Insert
.hInsertAfter
= TVI_LAST
;
138 Insert
.hParent
= TVI_ROOT
;
139 Insert
.item
.iSelectedImage
= Index
[0];
141 Insert
.item
.lParam
= 0;
142 LoadString(hApplet
, IDS_PROGANDUPDATES
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
143 Insert
.item
.pszText
= szBuf
;
144 Insert
.item
.iImage
= Index
[1];
145 hRootItem
= TreeView_InsertItem(hActList
, &Insert
);
147 Insert
.item
.lParam
= 1;
148 LoadString(hApplet
, IDS_PROGRAMS_ONLY
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
149 Insert
.item
.pszText
= szBuf
;
150 Insert
.item
.iImage
= Index
[1];
151 (VOID
) TreeView_InsertItem(hActList
, &Insert
);
153 Insert
.item
.lParam
= 2;
154 LoadString(hApplet
, IDS_UPDATES_ONLY
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
155 Insert
.item
.pszText
= szBuf
;
156 Insert
.item
.iImage
= Index
[1];
157 (VOID
) TreeView_InsertItem(hActList
, &Insert
);
159 (VOID
) TreeView_SelectItem(hActList
, hRootItem
);
163 InitControls - function for init all controls on main window
170 hMainFont
= CreateFont(-11 , 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
171 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_DONTCARE
, L
"Arial");
173 hActList
= CreateWindowEx(WS_EX_CLIENTEDGE
, WC_TREEVIEWW
, L
"",
174 WS_CHILD
|WS_VISIBLE
|WS_BORDER
|TVS_HASLINES
|TVS_LINESATROOT
|TVS_HASBUTTONS
|TVS_SHOWSELALWAYS
,
175 0, 0, 0, 0, hMainWnd
, NULL
, hApplet
, NULL
);
177 hAppList
= CreateWindowEx(WS_EX_CLIENTEDGE
, WC_LISTVIEWW
, L
"",
178 WS_CHILD
|WS_VISIBLE
|WS_BORDER
|LVS_SORTASCENDING
|LVS_REPORT
,
179 0, 0, 0, 0, hMainWnd
, NULL
, hApplet
, NULL
);
181 (VOID
) ListView_SetExtendedListViewStyle(hAppList
, LVS_EX_FULLROWSELECT
);
183 LoadString(hApplet
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
184 hSearch
= CreateWindowEx(WS_EX_CLIENTEDGE
, L
"EDIT", szBuf
, WS_CHILD
|WS_VISIBLE
|WS_BORDER
|ES_LEFT
,
185 0, 0, 0, 0, hMainWnd
, NULL
, hApplet
, NULL
);
186 SendMessage(hSearch
, WM_SETFONT
, (WPARAM
)hMainFont
, 0);
188 LoadString(hApplet
, IDS_REMOVE_BTN
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
189 hRemoveBtn
= CreateWindowEx(0, L
"BUTTON", szBuf
, WS_CHILD
|WS_VISIBLE
|WS_DISABLED
|BS_TEXT
,
190 0, 0, 0, 0, hMainWnd
, NULL
, hApplet
, NULL
);
191 SendMessage(hRemoveBtn
, WM_SETFONT
, (WPARAM
)hMainFont
, 0);
193 LoadString(hApplet
, IDS_MODIFY_BTN
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
194 hModifyBtn
= CreateWindowEx(0, L
"BUTTON", szBuf
, WS_CHILD
|WS_VISIBLE
|WS_DISABLED
|BS_TEXT
,
195 0, 0, 0, 0, hMainWnd
, NULL
, hApplet
, NULL
);
196 SendMessage(hModifyBtn
, WM_SETFONT
, (WPARAM
)hMainFont
, 0);
198 hUnderline
= LoadBitmap(hApplet
, MAKEINTRESOURCE(IDB_UNDERLINE
));
199 hSearchIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDI_SEARCH
));
206 GetARPInfo - Getting information from ARP cache
207 Input: szName - Application Name
208 Output: szPath - Path to image file
209 szSize - Application size
210 szLastUsed - Last used time
213 GetARPInfo(LPCWSTR szName
, LPWSTR szPath
, LPWSTR szSize
, LPWSTR szLastUsed
)
215 APPARPINFO aai
= {0};
216 DWORD dwSize
= sizeof(aai
), dwType
= REG_BINARY
;
217 SYSTEMTIME systime
, localtime
;
218 WCHAR szBuf
[MAX_PATH
];
221 swprintf(szBuf
, L
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Management\\ARPCache\\%s", szName
);
222 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
, szBuf
,
223 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
225 ZeroMemory(&aai
, sizeof(APPARPINFO
));
226 if ((RegQueryValueEx(hKey
, L
"SlowInfoCache", NULL
, &dwType
, (LPBYTE
)&aai
, &dwSize
) == ERROR_SUCCESS
) &&
227 (aai
.Size
== sizeof(APPARPINFO
)))
229 // Getting path to image
230 wcscpy(szPath
, aai
.ImagePath
);
232 // Getting application size
233 if (aai
.AppSize
< (ULONGLONG
) 2000000000)
235 swprintf(szSize
, L
"%.2f", (float)aai
.AppSize
/(1024*1024));
237 else wcscpy(szSize
,L
"---");
240 if (FileTimeToSystemTime(&aai
.LastUsed
, &systime
))
242 if (SystemTimeToTzSpecificLocalTime(NULL
, &systime
, &localtime
))
244 if (((int)localtime
.wYear
> 1900) && ((int)localtime
.wYear
< 3000))
246 GetDateFormat(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
, &localtime
,
247 NULL
, szLastUsed
, 256);
249 else wcscpy(szLastUsed
,L
"---");
251 else wcscpy(szLastUsed
,L
"---");
253 else wcscpy(szLastUsed
,L
"---");
257 wcscpy(szPath
,L
"---");
258 wcscpy(szSize
,L
"---");
259 wcscpy(szLastUsed
,L
"---");
266 AddItemToList - create application list
268 hSubKey - handle to the sub key for adding to LPARAM
269 szDisplayName - display name
270 ItemIndex - item index
271 AppName - application name (for getting ARPCache info)
274 AddItemToList(LPARAM hSubKey
, LPWSTR szDisplayName
, INT ItemIndex
, LPWSTR AppName
)
279 WCHAR IconPath
[MAX_PATH
], AppSize
[256], LastUsed
[256];
282 GetARPInfo(AppName
, IconPath
, AppSize
, LastUsed
);
284 if (GetFileAttributes(IconPath
) != 0xFFFFFFFF)
286 // FIXME: This function not getting 32-bits icon
287 ExtractIconEx(IconPath
, 0, NULL
, &hIcon
, 1);
292 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_CPLSYSTEM
), IMAGE_ICON
, 16, 16, LR_CREATEDIBSECTION
);
294 index
= ImageList_AddIcon(hImageAppList
, hIcon
);
297 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
298 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
299 listItem
.pszText
= (LPTSTR
)szDisplayName
;
300 listItem
.lParam
= (LPARAM
)hSubKey
;
301 listItem
.iItem
= (int)ItemIndex
;
302 listItem
.iImage
= index
;
303 iIndex
= ListView_InsertItem(hAppList
, &listItem
);
304 ListView_SetItemText(hAppList
, iIndex
, 1, LastUsed
);
305 ListView_SetItemText(hAppList
, iIndex
, 2, AppSize
);
310 if ShowMode = 0 - programs and updates
311 if ShowMode = 1 - show programs only
312 if ShowMode = 2 - show updates only
315 FillSoftwareList(INT ShowMode
)
317 WCHAR pszName
[MAX_PATH
];
318 WCHAR pszDisplayName
[MAX_PATH
];
319 WCHAR pszParentKeyName
[MAX_PATH
];
324 DWORD dwSize
= MAX_PATH
;
326 BOOL bIsUpdate
= FALSE
;
327 BOOL bIsSystemComponent
= FALSE
;
332 (VOID
) ImageList_Destroy(hImageAppList
);
333 (VOID
) ListView_DeleteAllItems(hAppList
);
335 pDevMode
.dmSize
= sizeof(DEVMODE
);
336 pDevMode
.dmDriverExtra
= 0;
337 EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &pDevMode
);
338 switch (pDevMode
.dmBitsPerPel
)
340 case 32: ColorDepth
= ILC_COLOR32
; break;
341 case 24: ColorDepth
= ILC_COLOR24
; break;
342 case 16: ColorDepth
= ILC_COLOR16
; break;
343 case 8: ColorDepth
= ILC_COLOR8
; break;
344 case 4: ColorDepth
= ILC_COLOR4
; break;
345 default: ColorDepth
= ILC_COLOR
; break;
348 hImageAppList
= ImageList_Create(16, 16, ColorDepth
| ILC_MASK
, 0, 1);
349 SendMessage(hAppList
, WM_SETREDRAW
, FALSE
, 0);
351 if (RegOpenKey(HKEY_LOCAL_MACHINE
,
352 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
353 &hKey
) != ERROR_SUCCESS
)
357 LoadString(hApplet
, IDS_UNABLEOPEN_UNINSTKEY
, Buf
, sizeof(Buf
) / sizeof(WCHAR
));
358 MessageBox(hMainWnd
, Buf
, NULL
, MB_ICONWARNING
);
364 while (RegEnumKeyEx(hKey
, ItemIndex
, pszName
, &dwSize
, NULL
, NULL
, NULL
, &FileTime
) == ERROR_SUCCESS
)
366 if (RegOpenKey(hKey
,pszName
,&hSubKey
) == ERROR_SUCCESS
)
369 dwSize
= sizeof(DWORD
);
370 if (RegQueryValueEx(hSubKey
, L
"SystemComponent",
372 (LPBYTE
)&dwValue
, &dwSize
) == ERROR_SUCCESS
)
374 bIsSystemComponent
= (dwValue
== 0x1);
378 bIsSystemComponent
= FALSE
;
383 bIsUpdate
= (RegQueryValueEx(hSubKey
, L
"ParentKeyName",
385 (LPBYTE
)pszParentKeyName
,
386 &dwSize
) == ERROR_SUCCESS
);
388 if (RegQueryValueEx(hSubKey
, L
"DisplayName",
390 (LPBYTE
)pszDisplayName
,
391 &dwSize
) == ERROR_SUCCESS
)
393 if ((ShowMode
< 0)||(ShowMode
> 2)) ShowMode
= 0;
394 if (!bIsSystemComponent
)
398 AddItemToList((LPARAM
)hSubKey
, (LPWSTR
)pszDisplayName
, ItemIndex
, pszName
);
400 if ((ShowMode
== 1)&&(!bIsUpdate
))
402 AddItemToList((LPARAM
)hSubKey
, (LPWSTR
)pszDisplayName
, ItemIndex
, pszName
);
404 if ((ShowMode
== 2)&&(bIsUpdate
))
406 AddItemToList((LPARAM
)hSubKey
, (LPWSTR
)pszDisplayName
, ItemIndex
, pszName
);
416 (VOID
) ListView_SetImageList(hAppList
, hImageAppList
, LVSIL_SMALL
);
417 SendMessage(hAppList
, WM_SETREDRAW
, TRUE
, 0);
418 RegCloseKey(hSubKey
);
423 GetAppString(LPCWSTR lpKeyName
, LPWSTR lpString
)
428 DWORD dwType
= REG_SZ
;
430 nIndex
= (INT
)SendMessage(hAppList
,LVM_GETNEXTITEM
,-1,LVNI_FOCUSED
);
435 ZeroMemory(&item
, sizeof(LVITEM
));
436 item
.mask
= LVIF_PARAM
;
438 (VOID
) ListView_GetItem(hAppList
,&item
);
439 hKey
= (HKEY
)item
.lParam
;
441 if (RegQueryValueEx(hKey
, lpKeyName
, NULL
, &dwType
,
442 (LPBYTE
)lpString
, &dwSize
) == ERROR_SUCCESS
)
456 WCHAR pszUninstallString
[MAX_PATH
];
460 nIndex
= (INT
)SendMessage(hAppList
,LVM_GETNEXTITEM
,-1,LVNI_FOCUSED
);
465 ZeroMemory(&item
, sizeof(LVITEM
));
466 item
.mask
= LVIF_PARAM
;
468 (VOID
) ListView_GetItem(hAppList
,&item
);
469 hKey
= (HKEY
)item
.lParam
;
473 if (RegQueryValueEx(hKey
, L
"UninstallString", NULL
, &dwType
,
474 (LPBYTE
)pszUninstallString
, &dwSize
) == ERROR_SUCCESS
)
477 PROCESS_INFORMATION pi
;
479 ZeroMemory(&si
, sizeof(si
));
481 si
.wShowWindow
= SW_SHOW
;
482 if (CreateProcess(NULL
,pszUninstallString
,NULL
,NULL
,FALSE
,0,NULL
,NULL
,&si
,&pi
))
484 CloseHandle(pi
.hThread
);
485 EnableWindow(hMainWnd
, FALSE
);
489 dwRet
= MsgWaitForMultipleObjects(1, &pi
.hProcess
, FALSE
, INFINITE
, QS_ALLEVENTS
);
490 if (dwRet
== WAIT_OBJECT_0
+ 1)
492 while (PeekMessage(&msg
, NULL
, 0, 0, PM_REMOVE
))
494 TranslateMessage(&msg
);
495 DispatchMessage(&msg
);
498 else if (dwRet
== WAIT_OBJECT_0
|| dwRet
== WAIT_FAILED
)
501 CloseHandle(pi
.hProcess
);
503 EnableWindow(hMainWnd
, TRUE
);
504 // Disable all buttons
505 EnableWindow(hRemoveBtn
,FALSE
);
506 EnableWindow(hModifyBtn
,FALSE
);
507 // Update software list
509 SetActiveWindow(hMainWnd
);
516 LoadString(hApplet
, IDS_UNABLEREAD_UNINSTSTR
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
517 MessageBox(hMainWnd
, szBuf
, NULL
, MB_ICONWARNING
);
523 ShowPopupMenu(HWND hwndDlg
, INT xPos
, INT yPos
)
526 nIndex
= (INT
)SendMessage(hAppList
,LVM_GETNEXTITEM
,-1,LVNI_FOCUSED
);
535 GetWindowRect(hAppList
, &lvRect
);
536 if (PtInRect(&lvRect
, pt
))
538 hMenu
= GetSubMenu(LoadMenu(hApplet
, MAKEINTRESOURCE(IDR_POPUP_APP
)),0);
539 TrackPopupMenuEx(hMenu
, TPM_RIGHTBUTTON
, xPos
, yPos
, hwndDlg
, NULL
);
546 GetAppInfo(LPWSTR lpInfo
)
548 WCHAR szBuf
[1024], szDesc
[1024];
552 iIndex
= SendMessage(hAppList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
558 ZeroMemory(&item
, sizeof(LVITEM
));
559 item
.mask
= LVIF_PARAM
;
561 (VOID
) ListView_GetItem(hAppList
,&item
);
562 hKey
= (HKEY
)item
.lParam
;
564 wcscpy(lpInfo
,L
"\0");
565 if (RegQueryValueEx(hKey
, L
"Publisher", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
567 LoadString(hApplet
, IDS_INF_PUBLISHER
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
568 //wcscat(lpInfo, szDesc);
569 swprintf(lpInfo
, L
"%s%s\n", szDesc
, szBuf
);
571 if (RegQueryValueEx(hKey
, L
"RegOwner", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
573 LoadString(hApplet
, IDS_INF_REG_OWNER
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
574 wcscat(lpInfo
, szDesc
);
575 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
577 if (RegQueryValueEx(hKey
, L
"ProductID", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
579 LoadString(hApplet
, IDS_INF_PRODUCT_ID
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
580 wcscat(lpInfo
, szDesc
);
581 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
583 if (RegQueryValueEx(hKey
, L
"DisplayVersion", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
585 LoadString(hApplet
, IDS_INF_VERSION
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
586 wcscat(lpInfo
, szDesc
);
587 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
589 if (RegQueryValueEx(hKey
, L
"Contact", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
591 LoadString(hApplet
, IDS_INF_CONTACT
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
592 wcscat(lpInfo
, szDesc
);
593 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
595 if (RegQueryValueEx(hKey
, L
"HelpLink", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
597 LoadString(hApplet
, IDS_INF_SUP_INFO
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
598 wcscat(lpInfo
, szDesc
);
599 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
601 if (RegQueryValueEx(hKey
, L
"HelpTelephone", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
603 LoadString(hApplet
, IDS_INF_SUP_PHONE
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
604 wcscat(lpInfo
, szDesc
);
605 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
607 if (RegQueryValueEx(hKey
, L
"URLUpdateInfo", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
609 LoadString(hApplet
, IDS_INF_PRODUCT_UPD
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
610 wcscat(lpInfo
, szDesc
);
611 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
613 if (RegQueryValueEx(hKey
, L
"Readme", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
615 LoadString(hApplet
, IDS_INF_README
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
616 wcscat(lpInfo
, szDesc
);
617 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
619 if (RegQueryValueEx(hKey
, L
"Comments", NULL
, NULL
, (LPBYTE
)szBuf
, &dwSize
) == ERROR_SUCCESS
)
621 LoadString(hApplet
, IDS_INF_COMMENTS
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
622 wcscat(lpInfo
, szDesc
);
623 swprintf(lpInfo
,L
"%s%s\n", lpInfo
, szBuf
);
625 if (wcslen(lpInfo
) < 10)
627 LoadString(hApplet
, IDS_NO_INFORMATION
, szDesc
, sizeof(szDesc
) / sizeof(WCHAR
));
628 wcscpy(lpInfo
, szDesc
);
636 WCHAR Info
[2048], szBuf
[1024];
638 if (-1 != (INT
) SendMessage(hAppList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
))
641 ListView_GetItemText(hAppList
, SendMessage(hAppList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
), 0, szBuf
, sizeof(szBuf
));
642 ShowMessage(szBuf
, Info
);
647 GetListItemText(LPARAM lParam1
, LPARAM lParam2
, INT iSubItem
, LPWSTR Item1
, LPWSTR Item2
)
652 find
.flags
= LVFI_PARAM
;
654 find
.lParam
= lParam1
;
655 iIndex
= ListView_FindItem(hAppList
, -1, &find
);
656 ListView_GetItemText(hAppList
, iIndex
, iSubItem
, Item1
, sizeof(Item1
));
658 find
.lParam
= lParam2
;
659 iIndex
= ListView_FindItem(hAppList
, -1, &find
);
660 ListView_GetItemText(hAppList
, iIndex
, iSubItem
, Item2
, sizeof(Item2
));
664 CompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
666 WCHAR szItem1
[MAX_PATH
], szItem2
[MAX_PATH
];
668 switch ((INT
)lParamSort
)
672 GetListItemText(lParam1
, lParam2
, 0, szItem1
, szItem2
);
673 if (bAscending
== TRUE
)
674 return wcscmp(szItem2
, szItem1
);
676 return wcscmp(szItem1
, szItem2
);
679 GetListItemText(lParam1
, lParam2
, 1, szItem1
, szItem2
);
680 if (bAscending
== TRUE
)
681 return wcscmp(szItem2
, szItem1
);
683 return wcscmp(szItem1
, szItem2
);
686 // FIXME: No correct sorting by application size
689 GetListItemText(lParam1
, lParam2
, 2, szItem1
, szItem2
);
690 if (wcscmp(szItem1
, L
"---") == 0) wcscpy(szItem1
, L
"0");
691 if (wcscmp(szItem2
, L
"---") == 0) wcscpy(szItem2
, L
"0");
692 Size1
= _wtoi(szItem1
);
693 Size2
= _wtoi(szItem2
);
696 return (bAscending
? -1 : 1);
698 else if (Size1
== Size2
)
702 else if (Size1
> Size2
)
704 return (bAscending
? 1 : -1);
719 if (RegOpenKeyEx(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\AppWiz", 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
721 dwSize
= sizeof(APPWIZSETTINGS
);
722 if (RegQueryValueEx(hKey
, L
"Settings", NULL
, NULL
, (LPBYTE
)&AppWizSettings
, &dwSize
) == ERROR_SUCCESS
)
724 Ret
= (AppWizSettings
.Size
== sizeof(APPWIZSETTINGS
));
740 if (RegCreateKeyEx(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\AppWiz", 0, NULL
,
741 REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
)
743 AppWizSettings
.Size
= sizeof(APPWIZSETTINGS
);
744 Ret
= (RegSetValueEx(hKey
, L
"Settings", 0, REG_BINARY
, (LPBYTE
)&AppWizSettings
, sizeof(APPWIZSETTINGS
)) == ERROR_SUCCESS
);
752 static void UpdateBitmap(HWND hWnd
, RECT WndRect
, RECT DescriptionRect
)
754 HDC hdc
= GetDC(hWnd
);
757 BackbufferHdc
= CreateCompatibleDC(hdc
);
760 DeleteObject(BackbufferBmp
);
762 BackbufferBmp
= CreateCompatibleBitmap(hdc
, WndRect
.right
, WndRect
.bottom
);
764 SelectObject(BackbufferHdc
, BackbufferBmp
);
765 FillRect(BackbufferHdc
, &WndRect
, (HBRUSH
)COLOR_APPWORKSPACE
);
766 DrawIconEx(BackbufferHdc
, 153, 1, hSearchIcon
, 24, 24, 0, NULL
, DI_NORMAL
|DI_COMPAT
);
767 DrawDescription(BackbufferHdc
, DescriptionRect
);
769 ReleaseDC(hWnd
, hdc
);
772 static LRESULT CALLBACK
773 WndProc(HWND hwnd
, UINT Message
, WPARAM wParam
, LPARAM lParam
)
775 static RECT DescriptionRect
;
784 MoveWindow(hMainWnd
, AppWizSettings
.Left
, AppWizSettings
.Top
,
785 AppWizSettings
.Right
- AppWizSettings
.Left
,
786 AppWizSettings
.Bottom
- AppWizSettings
.Top
, TRUE
);
787 if (AppWizSettings
.Maximized
) ShowWindow(hMainWnd
, SW_MAXIMIZE
);
788 ShowMessage(Strings
[0],Strings
[1]); // Welcome message
794 switch (LOWORD(wParam
))
800 if(HIWORD(wParam
) == BN_CLICKED
)
802 if (lParam
== (LPARAM
)hRemoveBtn
)
807 if (lParam
== (LPARAM
)hSearch
)
809 switch (HIWORD(wParam
))
815 LoadString(hApplet
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
816 GetWindowText(hSearch
, Tmp
, 1024);
817 if (wcscmp(szBuf
, Tmp
) == 0) SetWindowText(hSearch
, L
"");
822 GetWindowText(hSearch
, szBuf
, 1024);
823 if (wcslen(szBuf
) < 1)
825 LoadString(hApplet
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
826 SetWindowText(hSearch
, szBuf
);
839 HDC hdc
= BeginPaint(hwnd
, &ps
);
840 BitBlt(hdc
, 0, 0, ps
.rcPaint
.right
, ps
.rcPaint
.bottom
, BackbufferHdc
, 0, 0, SRCCOPY
);
846 LPNMHDR data
= (LPNMHDR
)lParam
;
851 if(data
->hwndFrom
== hActList
)
853 // Add items to programs list
854 FillSoftwareList(((LPNMTREEVIEW
)lParam
)->itemNew
.lParam
);
855 // Set default titile and message
856 ShowMessage(Strings
[0], Strings
[1]);
857 // Disable all buttons
858 EnableWindow(hRemoveBtn
, FALSE
);
859 EnableWindow(hModifyBtn
, FALSE
);
863 if(data
->hwndFrom
== hAppList
)
865 if (-1 != (INT
) SendMessage(hAppList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
))
867 EnableWindow(hRemoveBtn
, TRUE
);
868 if (GetAppString(L
"ModifyPath", NULL
))
869 EnableWindow(hModifyBtn
, TRUE
);
872 UpdateBitmap(hwnd
, AppRect
, DescriptionRect
);
873 InvalidateRect(hwnd
, &DescriptionRect
, FALSE
);
877 if(data
->hwndFrom
== hAppList
)
879 if (-1 != (INT
) SendMessage(hAppList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
))
885 case LVN_COLUMNCLICK
:
887 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
888 (VOID
) ListView_SortItems(hAppList
, CompareFunc
, pnmv
->iSubItem
);
889 bAscending
= !bAscending
;
897 LPRECT pRect
= (LPRECT
)lParam
;
898 if (pRect
->right
-pRect
->left
< 520)
899 pRect
->right
= pRect
->left
+ 520;
901 if (pRect
->bottom
-pRect
->top
< 400)
902 pRect
->bottom
= pRect
->top
+ 400;
907 RECT Rect
= {1, HIWORD(lParam
)-178, LOWORD(lParam
)-1, HIWORD(lParam
)-1};
908 SetRect(&AppRect
, 0, 0, LOWORD(lParam
)-1, HIWORD(lParam
)-1);
909 DescriptionRect
= Rect
;
912 ResizeControl(hActList
, 0, 1, 150, HIWORD(lParam
)-180);
915 ResizeControl(hAppList
, 152, 25, LOWORD(lParam
), HIWORD(lParam
)-180);
918 ResizeControl(hSearch
, 180, 1, LOWORD(lParam
), 25);
921 MoveWindow(hRemoveBtn
, LOWORD(lParam
)-105, HIWORD(lParam
)-30, 100, 25, TRUE
); // Remove button
922 MoveWindow(hModifyBtn
, LOWORD(lParam
)-208, HIWORD(lParam
)-30, 100, 25, TRUE
); // Modify button
924 (VOID
) ListView_SetColumnWidth(hAppList
, 0, LOWORD(lParam
)-330);
926 // Update title and info
928 UpdateBitmap(hwnd
, AppRect
, DescriptionRect
);
929 InvalidateRect(hwnd
, &DescriptionRect
, FALSE
);
937 // Show popup menu for programs list
938 ShowPopupMenu(hwnd
, GET_X_LPARAM(lParam
), GET_Y_LPARAM(lParam
));
946 ShowWindow(hMainWnd
, SW_HIDE
);
947 wp
.length
= sizeof(WINDOWPLACEMENT
);
948 GetWindowPlacement(hMainWnd
, &wp
);
949 AppWizSettings
.Left
= wp
.rcNormalPosition
.left
;
950 AppWizSettings
.Top
= wp
.rcNormalPosition
.top
;
951 AppWizSettings
.Right
= wp
.rcNormalPosition
.right
;
952 AppWizSettings
.Bottom
= wp
.rcNormalPosition
.bottom
;
953 AppWizSettings
.Maximized
= (IsZoomed(hMainWnd
) || (wp
.flags
& WPF_RESTORETOMAXIMIZED
));
955 // Destroy all and quit
957 DeleteDC(BackbufferHdc
);
959 DeleteObject(BackbufferBmp
);
960 DeleteObject(hMainFont
);
961 DeleteObject(hSearchIcon
);
966 return DefWindowProc(hwnd
, Message
, wParam
, lParam
);
974 AppWizSettings
.Maximized
= FALSE
;
975 AppWizSettings
.Left
= 0;
976 AppWizSettings
.Top
= 0;
977 AppWizSettings
.Right
= 520;
978 AppWizSettings
.Bottom
= 400;
983 MainWindowCreate(VOID
)
985 WNDCLASS WndClass
= {0};
989 // Load welcome strings
990 LoadString(hApplet
, IDS_WELCOME_TITLE
, Strings
[0], sizeof(szBuf
) / sizeof(WCHAR
));
991 LoadString(hApplet
, IDS_WELCOME_MSG
, Strings
[1], sizeof(szBuf
) / sizeof(WCHAR
));
996 WndClass
.lpszClassName
= L
"rosappwiz";
997 WndClass
.lpfnWndProc
= (WNDPROC
)WndProc
;
998 WndClass
.hInstance
= hApplet
;
999 WndClass
.style
= CS_HREDRAW
| CS_VREDRAW
;
1000 WndClass
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDI_CPLSYSTEM
));
1001 WndClass
.hCursor
= LoadCursor(hApplet
, IDC_ARROW
);
1002 WndClass
.hbrBackground
= (HBRUSH
)COLOR_BTNFACE
+ 1;
1004 if (!RegisterClass(&WndClass
)) return 0;
1006 LoadString(hApplet
, IDS_CPLSYSTEMNAME
, szBuf
, 256);
1007 hMainWnd
= CreateWindow(L
"rosappwiz", szBuf
,
1008 WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_VISIBLE
| WS_CAPTION
,
1009 CW_USEDEFAULT
, CW_USEDEFAULT
,
1010 0, 0, NULL
, NULL
, hApplet
, NULL
);
1013 ShowWindow(hMainWnd
, SW_SHOW
);
1014 UpdateWindow(hMainWnd
);
1017 while(GetMessage(&msg
,NULL
,0,0))
1019 TranslateMessage(&msg
);
1020 DispatchMessage(&msg
);
1026 /* Control Panel Callback */
1028 CPlApplet(HWND hwndCPl
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
)
1033 UNREFERENCED_PARAMETER(hwndCPl
);
1045 CPlInfo
= (CPLINFO
*)lParam2
;
1047 CPlInfo
->idIcon
= IDI_CPLSYSTEM
;
1048 CPlInfo
->idName
= IDS_CPLSYSTEMNAME
;
1049 CPlInfo
->idInfo
= IDS_CPLSYSTEMDESCRIPTION
;
1062 DllMain(HINSTANCE hinstDLL
, DWORD dwReason
, LPVOID lpvReserved
)
1064 UNREFERENCED_PARAMETER(lpvReserved
);
1068 case DLL_PROCESS_ATTACH
:
1069 case DLL_THREAD_ATTACH
: