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.
 
 
 
 
 
 

439 lines
12 KiB

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1993 **
//*********************************************************************
#include "admincfg.h"
#include "grouppri.h"
VIEWINFO ViewInfo;
HWND hwndToolbar;
HWND hwndStatusBar;
extern UINT nFileShortcutItems;
#ifdef INCL_GROUP_SUPPORT
extern GROUPPRIENTRY * pGroupPriEntryFirst;
#endif
VOID EnableMenuItems(HWND hwndApp,DWORD dwState)
{
HMENU hMenu = GetMenu(hwndApp);
BOOL fEnable;
UINT nIndex;
// enable "New" and "Open" if we can have a document (i.e. a template
// is loaded)
fEnable = dwState & AS_CANHAVEDOCUMENT;
EnableMenuItem(hMenu,IDM_NEW,(fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_NEW,MAKELONG(fEnable,0));
EnableMenuItem(hMenu,IDM_OPEN,(fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_OPEN,MAKELONG(fEnable,0));
for (nIndex=0;nIndex < nFileShortcutItems; nIndex++)
EnableMenuItem(hMenu,IDM_FILEHISTORY+nIndex,
(fEnable ? MF_ENABLED : MF_GRAYED));
// enable "Open Registry" if we can have a document, and if it's not already
// open
fEnable = ((dwState & AS_CANHAVEDOCUMENT) && !(dwState & AS_LOCALREGISTRY));
EnableMenuItem(hMenu,IDM_OPENREGISTRY,(fEnable ? MF_ENABLED : MF_GRAYED));
// enable "Save" and "Close" if we have a policy file or registry open
fEnable = dwState & AS_FILELOADED;
EnableMenuItem(hMenu,IDM_SAVE,( fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_SAVE,MAKELONG(fEnable,0));
EnableMenuItem(hMenu,IDM_CLOSE,(fEnable ? MF_ENABLED : MF_GRAYED));
// enable "Save As", "Add User", "Add Workstation", if we have a policy file
// but not if we're directly editing a registry
fEnable = ((dwState & AS_FILELOADED) && (dwState & AS_POLICYFILE));
EnableMenuItem(hMenu,IDM_SAVEAS,(fEnable ? MF_ENABLED : MF_GRAYED));
EnableMenuItem(hMenu,IDM_ADDUSER,(fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_ADDUSER,MAKELONG(fEnable,0));
EnableMenuItem(hMenu,IDM_ADDWORKSTATION,(fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_ADDWORKSTATION,MAKELONG(fEnable,0));
#ifdef INCL_GROUP_SUPPORT
EnableMenuItem(hMenu,IDM_ADDGROUP,(fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_ADDGROUP,MAKELONG(fEnable,0));
#endif
// enable "Remove" if we're editing policy file and the "OK to remove" flag
// is set (item is selected in list control)
fEnable = ((dwState & AS_CANREMOVE) && (dwState & AS_POLICYFILE));
EnableMenuItem(hMenu,IDM_REMOVE, (fEnable ? MF_ENABLED : MF_GRAYED));
SendMessage(hwndToolbar,TB_ENABLEBUTTON,IDM_REMOVE,MAKELONG(fEnable,0));
// enable "Copy" and "Paste" appropriately
fEnable = CanCopy(hwndUser);
EnableMenuItem(hMenu,IDM_COPY, (fEnable ? MF_ENABLED : MF_GRAYED));
fEnable = CanPaste(hwndUser);
EnableMenuItem(hMenu,IDM_PASTE, (fEnable ? MF_ENABLED : MF_GRAYED));
// enable "Properties" the "OK to remove" flag
// is set (item is selected in list control)
fEnable = (dwState & AS_CANREMOVE);
EnableMenuItem(hMenu,IDM_PROPERTIES, (fEnable ? MF_ENABLED : MF_GRAYED));
#ifdef INCL_GROUP_SUPPORT
// enable "Group priority..." if any group priority items in list
EnableMenuItem(hMenu,IDM_GROUPPRIORITY, (pGroupPriEntryFirst ?
MF_ENABLED : MF_GRAYED));
#endif
}
VOID CheckMenuItems(HWND hwndApp)
{
HMENU hMenu = GetMenu(hwndApp);
if (hMenu)
{
// update the menu item checkmarks
CheckMenuItem(hMenu,IDM_TOOLBAR,MF_BYCOMMAND | (ViewInfo.fToolbar ?
MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hMenu,IDM_STATUSBAR,MF_BYCOMMAND | (ViewInfo.fStatusBar ?
MF_CHECKED : MF_UNCHECKED));
}
}
VOID CheckViewItem(HWND hwndApp,DWORD dwView)
{
HMENU hMenu = GetMenu(hwndApp);
UINT uCmd;
switch (dwView) {
case VT_LARGEICONS:
uCmd = IDM_LARGEICONS;
break;
case VT_SMALLICONS:
uCmd = IDM_SMALLICONS;
break;
case VT_LIST:
uCmd = IDM_LIST;
break;
case VT_REPORT:
uCmd = IDM_DETAILS;
break;
default:
return;
}
CheckMenuRadioItem(hMenu, IDM_LARGEICONS, IDM_DETAILS,
uCmd, MF_BYCOMMAND);
}
VOID SetNewView(HWND hwndApp,HWND hwndList,DWORD dwNewView)
{
ViewInfo.dwView = dwNewView;
SetViewType(hwndList,ViewInfo.dwView);
CheckViewItem(hwndApp,ViewInfo.dwView);
}
VOID SetTitleBar(HWND hwndApp,CHAR * szFilename)
{
CHAR szTitle[255+SMALLBUF];
CHAR szAppName[SMALLBUF];
CHAR szUntitled[SMALLBUF];
CHAR szFormat[SMALLBUF];
LoadSz(IDS_APPNAME,szAppName,sizeof(szAppName));
LoadSz(IDS_TITLEFORMAT,szFormat,sizeof(szFormat));
if (dwAppState & AS_LOCALREGISTRY) {
wsprintf(szTitle,szFormat,szAppName,LoadSz(IDS_LOCALREGISTRY,szSmallBuf,
sizeof(szSmallBuf)));
} else if (dwAppState & AS_REMOTEREGISTRY) {
if (szFilename) {
CHAR szMsg[SMALLBUF+COMPUTERNAMELEN+1];
wsprintf(szMsg,LoadSz(IDS_REGISTRYON,szSmallBuf,sizeof(szSmallBuf)),
szFilename);
wsprintf(szTitle,szFormat,szAppName,szMsg);
} else {
lstrcpy(szTitle,szAppName);
}
} else if (szFilename) {
// make a title a la "AdminConfig - <filename>". If no filename yet,
// use "(untitled)".
wsprintf(szTitle,szFormat,szAppName,(lstrlen(szFilename) ? szFilename :
LoadSz(IDS_UNTITLED,szUntitled,sizeof(szUntitled))));
} else {
lstrcpy(szTitle,szAppName);
}
// Set the window text
SetWindowText(hwndApp,szTitle);
}
/*******************************************************************
NAME: InitToolbar
SYNOPSIS: Creates and initializes toolbar and status bar
ENTRY: HWND of main window
********************************************************************/
BOOL InitToolbar(HWND hWnd)
{
int border[3];
TBBUTTON tbButtons[] = {
{ 6, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0},
{ 7, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0},
{ 8, IDM_SAVE, 0, TBSTYLE_BUTTON, 0},
{ 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0},
{ 0, IDM_ADDUSER, 0, TBSTYLE_BUTTON,0},
#ifdef INCL_GROUP_SUPPORT
{ 2, IDM_ADDGROUP, 0, TBSTYLE_BUTTON,0},
#endif
{ 1, IDM_ADDWORKSTATION,0, TBSTYLE_BUTTON,0},
{ 5, IDM_REMOVE, 0, TBSTYLE_BUTTON,0} };
RECT rc;
TBADDBITMAP ab;
int nStdBtnOffset;
/* create Tool Bar */
hwndToolbar = CreateWindowEx (WS_EX_TOOLWINDOW,szToolbarClass,szNull,
(ViewInfo.fToolbar ? WS_VISIBLE : 0) | WS_CHILD | TBSTYLE_TOOLTIPS | WS_CLIPSIBLINGS,
0,0,100,30,hWnd,0,ghInst,NULL);
if (!hwndToolbar) {
MsgBox(hWnd,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
return FALSE;
}
// this tells the toolbar what version we are
SendMessage(hwndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
ab.hInst = HINST_COMMCTRL; // take them from commctrl
ab.nID = IDB_STD_SMALL_COLOR; // standard toolbar images
SendMessage(hwndToolbar, TB_ADDBITMAP, 0, (LPARAM)&ab);
ab.hInst = ghInst; // take them from our instance
ab.nID = IDB_TOOLBAR;
nStdBtnOffset = (int) SendMessage(hwndToolbar, TB_ADDBITMAP, 3, (LPARAM)&ab);
tbButtons[4].iBitmap = nStdBtnOffset + 0;
#ifdef INCL_GROUP_SUPPORT
tbButtons[5].iBitmap = nStdBtnOffset + 2;
tbButtons[6].iBitmap = nStdBtnOffset + 1;
#else
tbButtons[5].iBitmap = nStdBtnOffset + 1;
#endif
// add buttons
SendMessage(hwndToolbar,TB_ADDBUTTONS,sizeof(tbButtons)/sizeof(TBBUTTON),
(LPARAM) tbButtons);
GetClientRect( hwndToolbar, &rc );
ViewInfo.dyToolbar = rc.bottom+1;
/* create Status Bar */
hwndStatusBar = CreateStatusWindow( WS_CHILD | CCS_NOHILITE |
SBARS_SIZEGRIP | (ViewInfo.fStatusBar ? WS_VISIBLE : 0),
szNull, hWnd, IDC_STATUSBAR );
if (!hwndStatusBar) {
MsgBox(hWnd,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
return FALSE;
}
// set the border spacing
border[0] = 0;
border[1] = -1;
border[2] = 2;
SendMessage(hwndStatusBar, SB_SETBORDERS, 0, (LPARAM)(LPINT)border);
GetClientRect( hwndStatusBar, &rc );
ViewInfo.dyStatusBar = rc.bottom;
return TRUE;
}
/*******************************************************************
NAME: DeInitToolbar
SYNOPSIS: Destroys toolbar and status bar
********************************************************************/
VOID DeInitToolbar(VOID)
{
if (hwndToolbar) DestroyWindow(hwndToolbar);
if (hwndStatusBar) DestroyWindow(hwndStatusBar);
}
/*******************************************************************
NAME: ProcessTooltips
SYNOPSIS: Loads appropriate tip resource string and copies it into
buffer.
********************************************************************/
BOOL ProcessTooltips(TOOLTIPTEXT * pttt)
{
if (!pttt->hdr.idFrom) {
lstrcpy(pttt->szText,szNull);
return FALSE;
}
lstrcpy(pttt->szText,LoadSz(IDS_TIPS + (UINT)pttt->hdr.idFrom,szSmallBuf,
sizeof(szSmallBuf)));
return TRUE;
}
BOOL ReplaceMenuItem(HWND hWnd,UINT idOld,UINT idNew,UINT idResourceTxt)
{
MENUITEMINFO mii;
HMENU hMenu = GetMenu(hWnd);
if (!hMenu) return FALSE;
memset(&mii,0,sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mii.fType = MFT_STRING;
mii.wID = idNew;
mii.dwTypeData = (LPSTR) LoadSz(idResourceTxt,szSmallBuf,sizeof(szSmallBuf));
mii.cch = lstrlen(mii.dwTypeData);
if (InsertMenuItem(hMenu,idOld,FALSE,&mii)) {
RemoveMenu(hMenu,idOld,MF_BYCOMMAND);
}
DrawMenuBar(hWnd);
return TRUE;
}
VOID SetStatusText(CHAR * pszText)
{
// if NULL pointer, set to null string ("")
if (!pszText)
pszText = (CHAR *) szNull;
if (hwndStatusBar) {
SendMessage(hwndStatusBar,WM_SETTEXT,0,(LPARAM) pszText);
UpdateWindow(hwndStatusBar);
}
}
VOID GetStatusText(CHAR * pszText,UINT cbText)
{
if (!pszText)
return;
if (hwndStatusBar)
SendMessage(hwndStatusBar,WM_GETTEXT,cbText,(LPARAM) pszText);
}
VOID SetStatusItemCount(HWND hwndList)
{
UINT nCount = ListView_GetItemCount(hwndList);
if (nCount > 1) {
CHAR szStatusText[SMALLBUF];
wsprintf(szStatusText,LoadSz(IDS_ENTRIES,szSmallBuf,sizeof(szSmallBuf))
,nCount);
SetStatusText(szStatusText);
} else {
SetStatusText(LoadSz( (nCount == 0 ? IDS_NOENTRIES : IDS_ONEENTRY),
szSmallBuf,sizeof(szSmallBuf)));
}
}
VOID AddFileShortcut(HMENU hMenu,CHAR * pszNewFilename)
{
MENUITEMINFO mii;
CHAR szFilename[MAX_PATH+1];
UINT nIndex;
memset(&mii,0,sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_STRING;
mii.dwTypeData = szFilename;
mii.cch = sizeof(szFilename);
// see if there is an existing shortcut with this name
for (nIndex = 0;nIndex<nFileShortcutItems;nIndex++) {
mii.cch = sizeof(szFilename);
if (GetMenuItemInfo(hMenu,IDM_FILEHISTORY+nIndex,
FALSE,&mii) && !lstrcmpi(szFilename,pszNewFilename))
return; // already has a shortcut menu item, nothing to do
}
// add another menu item if we have less than max shorcuts
if (nFileShortcutItems < FILEHISTORY_COUNT) {
MENUITEMINFO miiTmp;
memset(&miiTmp,0,sizeof(miiTmp));
miiTmp.cbSize = sizeof(miiTmp);
// add a separator if this is first shortcut item
if (!nFileShortcutItems) {
miiTmp.fMask = MIIM_TYPE;
miiTmp.fType = MFT_SEPARATOR;
InsertMenuItem(hMenu,GetMenuItemCount(hMenu),TRUE,&miiTmp);
}
// add a menu item with empty string, string will get set below
miiTmp.fType = MFT_STRING;
miiTmp.wID = IDM_FILEHISTORY + nFileShortcutItems;
miiTmp.fMask = MIIM_TYPE | MIIM_ID;
miiTmp.dwTypeData = (LPSTR) szNull;
mii.cch = 1;
InsertMenuItem(hMenu,GetMenuItemCount(hMenu),TRUE,&miiTmp);
nFileShortcutItems ++;
}
// move existing items down one slot to make new one most recent
if (nFileShortcutItems) {
for (nIndex=nFileShortcutItems-1;nIndex > 0;nIndex --) {
mii.cch = sizeof(szFilename);
if (GetMenuItemInfo(hMenu,IDM_FILEHISTORY+nIndex-1,
FALSE,&mii))
SetMenuItemInfo(hMenu,IDM_FILEHISTORY+nIndex,
FALSE,&mii);
}
}
lstrcpy(szFilename,pszNewFilename);
mii.cch = lstrlen(szFilename);
SetMenuItemInfo(hMenu,IDM_FILEHISTORY,
FALSE,&mii);
}
VOID SetViewType(HWND hwndList,DWORD dwView)
{
DWORD dwStyle;
switch (dwView) {
case VT_LARGEICONS:
dwStyle = LVS_ICON;
break;
case VT_SMALLICONS:
dwStyle = LVS_SMALLICON;
break;
case VT_LIST:
dwStyle = LVS_LIST;
break;
case VT_REPORT:
dwStyle = LVS_REPORT;
break;
default:
return; // invalid dwView constant
}
// set the window style to change the view type
SetWindowLong(hwndList,GWL_STYLE,
(GetWindowLong(hwndList,GWL_STYLE) & ~LVS_TYPEMASK) | dwStyle);
ListView_Arrange(hwndList,LVA_SORTASCENDING);
}