2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/propsheet_depends.c
5 * PURPOSE: Property dialog box message handler
6 * COPYRIGHT: Copyright 2006-2009 Ged Murphy <gedmurphy@reactos.org>
14 AddItemToTreeView(HWND hTreeView
,
22 TV_INSERTSTRUCT tvins
;
26 ZeroMemory(&tvi
, sizeof(tvi
));
27 ZeroMemory(&tvins
, sizeof(tvins
));
29 tvi
.mask
= TVIF_TEXT
| TVIF_PARAM
| TVIF_SELECTEDIMAGE
| TVIF_IMAGE
| TVIF_CHILDREN
;
30 tvi
.pszText
= lpDisplayName
;
31 tvi
.cchTextMax
= _tcslen(lpDisplayName
);
32 tvi
.cChildren
= bHasChildren
;
34 /* Select the image for this service */
37 case SERVICE_WIN32_OWN_PROCESS
:
38 case SERVICE_WIN32_SHARE_PROCESS
:
39 tvi
.iImage
= IMAGE_SERVICE
;
40 tvi
.iSelectedImage
= IMAGE_SERVICE
;
43 case SERVICE_KERNEL_DRIVER
:
44 case SERVICE_FILE_SYSTEM_DRIVER
:
45 tvi
.iImage
= IMAGE_DRIVER
;
46 tvi
.iSelectedImage
= IMAGE_DRIVER
;
50 tvi
.iImage
= IMAGE_UNKNOWN
;
51 tvi
.iSelectedImage
= IMAGE_UNKNOWN
;
57 dwSize
= _tcslen(lpServiceName
) + 1;
58 /* Attach the service name */
59 lpName
= (LPTSTR
)HeapAlloc(GetProcessHeap(),
61 dwSize
* sizeof(TCHAR
));
64 _tcscpy_s(lpName
, dwSize
, lpServiceName
);
65 tvi
.lParam
= (LPARAM
)lpName
;
70 tvins
.hParent
= hParent
;
72 return TreeView_InsertItem(hTreeView
, &tvins
);
76 TreeView_GetItemParam(HWND hTreeView
,
82 tv
.mask
= TVIF_PARAM
| TVIF_HANDLE
;
85 if (TreeView_GetItem(hTreeView
, &tv
))
94 DestroyItem(HWND hTreeView
,
100 /* Does this item have any children */
101 hChildItem
= TreeView_GetChild(hTreeView
, hItem
);
104 /* It does, recurse to that one */
105 DestroyItem(hTreeView
, hChildItem
);
108 /* Get the string and free it */
109 lpServiceName
= (LPTSTR
)TreeView_GetItemParam(hTreeView
, hItem
);
112 HeapFree(GetProcessHeap(),
119 DestroyTreeView(HWND hTreeView
)
123 /* Get the first item in the top level */
124 hItem
= TreeView_GetFirstVisible(hTreeView
);
127 /* Kill it and all children */
128 DestroyItem(hTreeView
, hItem
);
130 /* Kill all remaining top level items */
133 /* Are there any more items at the top level */
134 hItem
= TreeView_GetNextSibling(hTreeView
, hItem
);
137 /* Kill it and all children */
138 DestroyItem(hTreeView
, hItem
);
146 TreeView_GetItemText(HWND hTreeView,
153 tv.mask = TVIF_TEXT | TVIF_HANDLE;
155 tv.pszText = lpBuffer;
156 tv.cchTextMax = (int)cbBuffer;
158 return TreeView_GetItem(hTreeView, &tv);
163 InitDependPage(PSERVICEPROPSHEET pDlgInfo
)
165 /* Initialize the image list */
166 pDlgInfo
->hDependsImageList
= InitImageList(IDI_NODEPENDS
,
168 GetSystemMetrics(SM_CXSMICON
),
169 GetSystemMetrics(SM_CXSMICON
),
172 /* Set the first tree view */
173 TV1_Initialize(pDlgInfo
, pDlgInfo
->pService
->lpServiceName
);
175 /* Set the second tree view */
176 TV2_Initialize(pDlgInfo
, pDlgInfo
->pService
->lpServiceName
);
181 * Dependancies Property dialog callback.
182 * Controls messages to the Dependancies dialog
185 DependenciesPageProc(HWND hwndDlg
,
190 PSERVICEPROPSHEET pDlgInfo
;
192 /* Get the window context */
193 pDlgInfo
= (PSERVICEPROPSHEET
)GetWindowLongPtr(hwndDlg
,
195 if (pDlgInfo
== NULL
&& uMsg
!= WM_INITDIALOG
)
204 pDlgInfo
= (PSERVICEPROPSHEET
)(((LPPROPSHEETPAGE
)lParam
)->lParam
);
205 if (pDlgInfo
!= NULL
)
207 SetWindowLongPtr(hwndDlg
,
211 pDlgInfo
->hDependsWnd
= hwndDlg
;
213 InitDependPage(pDlgInfo
);
220 switch (((LPNMHDR
)lParam
)->code
)
222 case TVN_ITEMEXPANDING
:
224 LPNMTREEVIEW lpnmtv
= (LPNMTREEVIEW
)lParam
;
226 if (lpnmtv
->action
== TVE_EXPAND
)
228 if (lpnmtv
->hdr
.idFrom
== IDC_DEPEND_TREE1
)
230 /* Has this node been expanded before */
231 if (!TreeView_GetChild(pDlgInfo
->hDependsTreeView1
, lpnmtv
->itemNew
.hItem
))
233 /* It's not, add the children */
234 TV1_AddDependantsToTree(pDlgInfo
, lpnmtv
->itemNew
.hItem
, (LPTSTR
)lpnmtv
->itemNew
.lParam
);
237 else if (lpnmtv
->hdr
.idFrom
== IDC_DEPEND_TREE2
)
239 /* Has this node been expanded before */
240 if (!TreeView_GetChild(pDlgInfo
->hDependsTreeView2
, lpnmtv
->itemNew
.hItem
))
242 /* It's not, add the children */
243 TV2_AddDependantsToTree(pDlgInfo
, lpnmtv
->itemNew
.hItem
, (LPTSTR
)lpnmtv
->itemNew
.lParam
);
254 switch(LOWORD(wParam
))
261 DestroyTreeView(pDlgInfo
->hDependsTreeView1
);
262 DestroyTreeView(pDlgInfo
->hDependsTreeView2
);
264 if (pDlgInfo
->hDependsImageList
)
265 ImageList_Destroy(pDlgInfo
->hDependsImageList
);