Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

437 lines
9.6 KiB

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1993 **
//*********************************************************************
#include "admincfg.h"
HWND hwndMain=NULL;
HWND hwndUser=NULL;
BOOL OnCreate(HWND hWnd);
BOOL OnInit(HWND hWnd);
VOID OnDestroy(HWND hWnd);
VOID ProcessMouseDown(HWND hwndParent,HWND hwndTree);
VOID ProcessMouseUp(HWND hwndParent,HWND hwndTree);
VOID ProcessMouseMove(HWND hwndParent,HWND hwndTree);
VOID CheckMenuItems(HWND hwndApp);
DWORD dwAppState = 0;
BOOL fNetworkInstalled = 0;
TCHAR szDatFilename[MAX_PATH+1]=TEXT("");
TCHAR szDlgModeUserName[USERNAMELEN+1];
extern HGLOBAL hClipboardUser;
/*******************************************************************
NAME: WndProc
SYNOPSIS: Window proc for main window
********************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int wmId, wmEvent;
switch (message) {
case WM_COMMAND: // message: command from application menu
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
if (wmId >= IDM_FILEHISTORY && wmId < IDM_FILEHISTORY +
FILEHISTORY_COUNT) {
MENUITEMINFO mii;
TCHAR szFilename[MAX_PATH+1];
mii.dwTypeData = szFilename;
mii.cch = ARRAYSIZE(szFilename);
// this is a file menu shortcut with a filename, try
// to open
if (!(dwAppState & AS_CANHAVEDOCUMENT))
return FALSE;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.wID = wmId;
if (GetMenuItemInfo(GetSubMenu(GetMenu(hWnd),0),
wmId,FALSE,&mii)) {
if (!lstrlen(szFilename))
return FALSE;
if (dwAppState & AS_FILEDIRTY) {
if (!QueryForSave(hWnd,hwndUser))
return TRUE; // user cancelled
}
// open the file
OnOpen_W(hWnd,hwndUser,szFilename);
return TRUE;
}
}
switch (wmId) {
case IDM_ABOUT:
ShellAboutA ( hWnd, szAppName, szNull,
LoadIcon( ghInst, MAKEINTRESOURCE(IDI_APPICON)) );
break;
case IDM_EXIT:
if (dwAppState & AS_FILEDIRTY) {
if (!QueryForSave(hWnd,hwndUser)) return TRUE; // user cancelled
}
DestroyWindow(hWnd);
break;
case IDM_NEW:
OnNew(hWnd,hwndUser);
break;
case IDM_OPEN:
OnOpen(hWnd,hwndUser);
break;
case IDM_OPENREGISTRY:
OnOpenRegistry(hWnd,hwndUser,TRUE);
break;
case IDM_TEMPLATEOPT:
OnTemplateOptions(hWnd);
break;
#ifdef INCL_GROUP_SUPPORT
case IDM_GROUPPRIORITY:
OnGroupPriority(hWnd);
break;
#endif
case IDM_SAVE:
OnSave(hWnd,hwndUser);
break;
case IDM_SAVEAS:
OnSaveAs(hWnd,hwndUser);
break;
case IDM_CLOSE:
OnClose(hWnd,hwndUser);
break;
case IDM_COPY:
OnCopy(hWnd,hwndUser);
break;
case IDM_PASTE:
OnPaste(hWnd,hwndUser);
break;
case IDM_CONNECT:
OnConnect(hWnd,hwndUser);
break;
case IDM_DISCONNECT:
OnClose(hWnd,hwndUser);
break;
case IDM_ADDUSER:
DoAddUserDlg(hWnd,hwndUser);
break;
#ifdef INCL_GROUP_SUPPORT
case IDM_ADDGROUP:
DoAddGroupDlg(hWnd,hwndUser);
break;
#endif
case IDM_REMOVE:
OnRemove(hWnd,hwndUser);
break;
case IDM_ADDWORKSTATION:
DoAddComputerDlg(hWnd,hwndUser);
break;
case IDM_PROPERTIES:
OnProperties(hWnd,hwndUser);
break;
case IDM_SMALLICONS:
SetNewView(hWnd,hwndUser,VT_SMALLICONS);
break;
case IDM_LARGEICONS:
SetNewView(hWnd,hwndUser,VT_LARGEICONS);
break;
case IDM_LIST:
SetNewView(hWnd,hwndUser,VT_LIST);
break;
case IDM_DETAILS:
SetNewView(hWnd,hwndUser,VT_REPORT);
break;
case IDM_TOOLBAR:
ViewInfo.fToolbar = !ViewInfo.fToolbar;
ShowWindow(hwndToolbar,(ViewInfo.fToolbar ? SW_SHOW : SW_HIDE));
UpdateListControlPlacement(hWnd,hwndUser);
CheckMenuItems(hWnd);
break;
case IDM_STATUSBAR:
ViewInfo.fStatusBar = !ViewInfo.fStatusBar;
ShowWindow(hwndStatusBar,(ViewInfo.fStatusBar ? SW_SHOW : SW_HIDE));
UpdateListControlPlacement(hWnd,hwndUser);
CheckMenuItems(hWnd);
break;
case IDM_HELPCONTENTS:
HtmlHelp(hWnd,LoadSz(IDS_HELPFILE,szSmallBuf,ARRAYSIZE(szSmallBuf)),
HH_HELP_FINDER,0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
break;
case WM_CREATE:
if (!OnCreate(hWnd)) {
return (-1); // fail creation
}
return 0;
break;
case WM_FINISHINIT:
OnInit(hWnd); // finish doing init stuff
break;
case WM_SETFOCUS:
if (hwndUser) SetFocus(hwndUser);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
}
break;
case WM_QUERYENDSESSION:
case WM_CLOSE:
if (dwAppState & AS_FILEDIRTY) {
if (!QueryForSave(hWnd,hwndUser)) return TRUE; // user cancelled
}
goto defproc;
break;
case WM_DESTROY:
OnDestroy(hWnd);
break;
case WM_SIZE:
if (hwndStatusBar)
SendMessage( hwndStatusBar, WM_SIZE, wParam, lParam );
if (hwndToolbar)
SendMessage( hwndToolbar, WM_SIZE, wParam, lParam );
UpdateListControlPlacement(hWnd,hwndUser);
break;
case WM_NOTIFY:
if (((NMHDR *) lParam)->hwndFrom == hwndUser) {
return OnListNotify(hWnd,hwndUser,(NM_LISTVIEW *) lParam);
}
{
NMHDR * pnmhdr = (NMHDR *) lParam;
if (pnmhdr->code == TTN_NEEDTEXT &&
pnmhdr->hwndFrom == (HWND)
SendMessage(hwndToolbar,TB_GETTOOLTIPS,0,0L))
return (ProcessTooltips((TOOLTIPTEXT *) lParam));
}
break;
default: // Passes it on if unproccessed
defproc:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
BOOL OnCreate(HWND hWnd)
{
hwndMain=hWnd;
InitCommonControls();
RestoreStateFromRegistry(hWnd);
dwAppState = AS_CANOPENTEMPLATE;
if (!InitImageLists() || !(hwndUser=CreateListControl(hWnd)) ||
(!InitToolbar(hWnd))) {
MsgBox(hWnd,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
FreeImageLists();
DestroyListControl(hwndUser);
hwndUser=NULL;
DeInitToolbar();
return FALSE;
}
EnableWindow(hwndUser, FALSE);
LoadFileMenuShortcuts(GetSubMenu(GetMenu(hWnd),0));
SetNewView(hWnd,hwndUser,ViewInfo.dwView);
UpdateListControlPlacement(hWnd,hwndUser);
SetFocus(hwndUser);
// send a WM_FINISHINIT message to ourselves to load template file
// and data file. Do this after WM_CREATE returns so that status
// bar can display text, etc
PostMessage(hWnd,WM_FINISHINIT,0,0L);
return TRUE;
}
BOOL OnInit(HWND hWnd)
{
HKEY hKey;
// check to see if we have a network installed
if (GetSystemMetrics(SM_NETWORK) & 0x1) {
fNetworkInstalled = TRUE;
}
if (fNetworkInstalled) {
// add a "connect" menu item
MENUITEMINFO mii;
HMENU hMenu = GetSubMenu(GetMenu(hWnd),0);
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_SEPARATOR;
InsertMenuItem(hMenu,6,TRUE,&mii);
mii.fMask = MIIM_TYPE | MIIM_ID;
mii.wID = IDM_CONNECT;
mii.fType = MFT_STRING;
mii.dwTypeData = szSmallBuf;
LoadSz(IDS_CONNECT,szSmallBuf,ARRAYSIZE(szSmallBuf));
InsertMenuItem(hMenu,7,TRUE,&mii);
}
if (!(dwCmdLineFlags & CLF_DIALOGMODE)) {
if ((LoadTemplates(hWnd) == ERROR_SUCCESS)
|| (GetATemplateFile(hWnd) && (LoadTemplates(hWnd) == ERROR_SUCCESS))) {
dwAppState |= AS_CANHAVEDOCUMENT;
}
}
// if filename specified on command line, try to load it
if (!(dwCmdLineFlags & CLF_DIALOGMODE) && szDatFilename[0]) {
OnOpen_W(hWnd,hwndUser,szDatFilename);
}
EnableMenuItems(hWnd,dwAppState);
CheckMenuItems(hWnd);
return TRUE;
}
VOID RunDialogMode(HWND hWnd,HWND hwndUser)
{
int iStart = 0;
HGLOBAL hUser=NULL;
UINT uRet;
extern DWORD dwDlgRetCode;
// load the template file
if (uRet = LoadTemplates(hWnd) != ERROR_SUCCESS) {
switch (uRet) {
case ERROR_FILE_NOT_FOUND:
dwDlgRetCode = AD_ADMNOTFOUND;
break;
case ERROR_NOT_ENOUGH_MEMORY:
dwDlgRetCode = AD_OUTOFMEMORY;
break;
default:
dwDlgRetCode = AD_ADMLOADERR;
break;
}
return;
}
// try to load the data file
if (!LoadFile(szDatFilename,hWnd,hwndUser,FALSE)) {
// if we can't load it, try creating it
if (CreateHiveFile(szDatFilename) != ERROR_SUCCESS ||
!LoadFile(szDatFilename,hWnd,hwndUser,TRUE)) {
dwDlgRetCode = AD_POLLOADERR;
return;
}
}
dwAppState = AS_FILELOADED | AS_FILEHASNAME | AS_LOCALREGISTRY;
hUser = FindUser(hwndUser,szDlgModeUserName,(dwCmdLineFlags & CLF_USEWORKSTATIONNAME
? UT_MACHINE : UT_USER));
// if user is not in policy file, create a new one
if (!hUser) {
hUser = AddUser(hwndUser,szDlgModeUserName,(dwCmdLineFlags &
CLF_USEWORKSTATIONNAME ? UT_MACHINE : UT_USER));
}
if (!hUser) {
MsgBox(hWnd,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
dwDlgRetCode = AD_OUTOFMEMORY;
return;
}
// run properties dialog
if (DoPolicyDlg(hWnd,hUser)) {
// save changes if user OK's the dialog
dwAppState = AS_FILELOADED | AS_FILEHASNAME | AS_POLICYFILE | AS_FILEDIRTY;
if (!SaveFile(szDatFilename,hWnd,hwndUser))
dwDlgRetCode = AD_POLSAVEERR;
}
}
VOID OnDestroy(HWND hWnd)
{
UnloadTemplates();
#ifdef INCL_GROUP_SUPPORT
FreeGroupPriorityList();
#endif
SaveStateToRegistry(hWnd);
SaveFileMenuShortcuts(GetSubMenu(GetMenu(hWnd),0));
if (hwndUser)
RemoveAllUsers(hwndUser);
if (hClipboardUser)
GlobalFree(hClipboardUser);
DestroyListControl(hwndUser);
hwndUser=NULL;
DeInitToolbar();
FreeImageLists();
if (pbufTemplates)
{
GlobalUnlock(hBufTemplates);
GlobalFree(hBufTemplates);
}
PostQuitMessage(0);
}