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>
13 AddItemToTreeView(HWND hTreeView
,
21 TV_INSERTSTRUCT tvins
;
25 ZeroMemory(&tvi
, sizeof(tvi
));
26 ZeroMemory(&tvins
, sizeof(tvins
));
28 tvi
.mask
= TVIF_TEXT
| TVIF_PARAM
| TVIF_SELECTEDIMAGE
| TVIF_IMAGE
| TVIF_CHILDREN
;
29 tvi
.pszText
= lpDisplayName
;
30 tvi
.cchTextMax
= _tcslen(lpDisplayName
);
31 tvi
.cChildren
= bHasChildren
;
33 /* Select the image for this service */
36 case SERVICE_WIN32_OWN_PROCESS
:
37 case SERVICE_WIN32_SHARE_PROCESS
:
38 tvi
.iImage
= IMAGE_SERVICE
;
39 tvi
.iSelectedImage
= IMAGE_SERVICE
;
42 case SERVICE_KERNEL_DRIVER
:
43 case SERVICE_FILE_SYSTEM_DRIVER
:
44 tvi
.iImage
= IMAGE_DRIVER
;
45 tvi
.iSelectedImage
= IMAGE_DRIVER
;
49 tvi
.iImage
= IMAGE_UNKNOWN
;
50 tvi
.iSelectedImage
= IMAGE_UNKNOWN
;
56 dwSize
= _tcslen(lpServiceName
) + 1;
57 /* Attach the service name */
58 lpName
= (LPTSTR
)HeapAlloc(GetProcessHeap(),
60 dwSize
* sizeof(TCHAR
));
63 StringCchCopy(lpName
, dwSize
, lpServiceName
);
64 tvi
.lParam
= (LPARAM
)lpName
;
69 tvins
.hParent
= hParent
;
71 return TreeView_InsertItem(hTreeView
, &tvins
);
75 TreeView_GetItemParam(HWND hTreeView
,
81 tv
.mask
= TVIF_PARAM
| TVIF_HANDLE
;
84 if (TreeView_GetItem(hTreeView
, &tv
))
93 DestroyItem(HWND hTreeView
,
99 /* Does this item have any children */
100 hChildItem
= TreeView_GetChild(hTreeView
, hItem
);
103 /* It does, recurse to that one */
104 DestroyItem(hTreeView
, hChildItem
);
107 /* Get the string and free it */
108 lpServiceName
= (LPTSTR
)TreeView_GetItemParam(hTreeView
, hItem
);
111 HeapFree(GetProcessHeap(),
118 DestroyTreeView(HWND hTreeView
)
122 /* Get the first item in the top level */
123 hItem
= TreeView_GetFirstVisible(hTreeView
);
126 /* Kill it and all children */
127 DestroyItem(hTreeView
, hItem
);
129 /* Kill all remaining top level items */
132 /* Are there any more items at the top level */
133 hItem
= TreeView_GetNextSibling(hTreeView
, hItem
);
136 /* Kill it and all children */
137 DestroyItem(hTreeView
, hItem
);
145 TreeView_GetItemText(HWND hTreeView,
152 tv.mask = TVIF_TEXT | TVIF_HANDLE;
154 tv.pszText = lpBuffer;
155 tv.cchTextMax = (int)cbBuffer;
157 return TreeView_GetItem(hTreeView, &tv);
162 InitDependPage(PSERVICEPROPSHEET pDlgInfo
)
164 /* Initialize the image list */
165 pDlgInfo
->hDependsImageList
= InitImageList(IDI_NODEPENDS
,
167 GetSystemMetrics(SM_CXSMICON
),
168 GetSystemMetrics(SM_CXSMICON
),
171 /* Set the first tree view */
172 TV1_Initialize(pDlgInfo
, pDlgInfo
->pService
->lpServiceName
);
174 /* Set the second tree view */
175 TV2_Initialize(pDlgInfo
, pDlgInfo
->pService
->lpServiceName
);
179 * Dependancies Property dialog callback.
180 * Controls messages to the Dependancies dialog
183 DependenciesPageProc(HWND hwndDlg
,
188 PSERVICEPROPSHEET pDlgInfo
;
190 /* Get the window context */
191 pDlgInfo
= (PSERVICEPROPSHEET
)GetWindowLongPtr(hwndDlg
,
193 if (pDlgInfo
== NULL
&& uMsg
!= WM_INITDIALOG
)
202 pDlgInfo
= (PSERVICEPROPSHEET
)(((LPPROPSHEETPAGE
)lParam
)->lParam
);
203 if (pDlgInfo
!= NULL
)
205 SetWindowLongPtr(hwndDlg
,
209 pDlgInfo
->hDependsWnd
= hwndDlg
;
211 InitDependPage(pDlgInfo
);
218 switch (((LPNMHDR
)lParam
)->code
)
220 case TVN_ITEMEXPANDING
:
222 LPNMTREEVIEW lpnmtv
= (LPNMTREEVIEW
)lParam
;
224 if (lpnmtv
->action
== TVE_EXPAND
)
226 if (lpnmtv
->hdr
.idFrom
== IDC_DEPEND_TREE1
)
228 /* Has this node been expanded before */
229 if (!TreeView_GetChild(pDlgInfo
->hDependsTreeView1
, lpnmtv
->itemNew
.hItem
))
231 /* It's not, add the children */
232 TV1_AddDependantsToTree(pDlgInfo
, lpnmtv
->itemNew
.hItem
, (LPTSTR
)lpnmtv
->itemNew
.lParam
);
235 else if (lpnmtv
->hdr
.idFrom
== IDC_DEPEND_TREE2
)
237 /* Has this node been expanded before */
238 if (!TreeView_GetChild(pDlgInfo
->hDependsTreeView2
, lpnmtv
->itemNew
.hItem
))
240 /* It's not, add the children */
241 TV2_AddDependantsToTree(pDlgInfo
, lpnmtv
->itemNew
.hItem
, (LPTSTR
)lpnmtv
->itemNew
.lParam
);
252 switch(LOWORD(wParam
))
259 DestroyTreeView(pDlgInfo
->hDependsTreeView1
);
260 DestroyTreeView(pDlgInfo
->hDependsTreeView2
);
262 if (pDlgInfo
->hDependsImageList
)
263 ImageList_Destroy(pDlgInfo
->hDependsImageList
);