430 lines
12 KiB
C++
430 lines
12 KiB
C++
/*======================================================================================//
|
|
| Process Control //
|
|
| //
|
|
|Copyright (c) 1998 Sequent Computer Systems, Incorporated. All rights reserved. //
|
|
| //
|
|
|File Name: NameRulePages.cpp //
|
|
| //
|
|
|Description: Implementation of name rule property pages //
|
|
| //
|
|
|Created: Paul Skoglund 07-1998 //
|
|
| //
|
|
|Rev History: //
|
|
| //
|
|
|=======================================================================================*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "NameRulePages.h"
|
|
#include "globals.h"
|
|
#include "HelpTopics.h"
|
|
|
|
#include "ManagementPages.h"
|
|
#include "ManagementRuleWizards.h"
|
|
|
|
BOOL NameRuleDlg(PCNameRule &out, PCNameRule *In /* = NULL */, BOOL bReadOnly /* = FALSE */ )
|
|
{
|
|
PROPSHEETHEADER sheet;
|
|
memset(&sheet, 0, sizeof(PROPSHEETHEADER));
|
|
sheet.dwSize = sizeof(PROPSHEETHEADER);
|
|
sheet.dwFlags = PSH_NOAPPLYNOW | PSH_USEICONID;
|
|
sheet.hwndParent = ::GetActiveWindow();
|
|
sheet.hInstance = _Module.GetResourceInstance();
|
|
sheet.pszIcon = MAKEINTRESOURCE(IDI_ALIASRULES);
|
|
if (In)
|
|
sheet.pszCaption = MAKEINTRESOURCE(IDS_NRULE_EDIT_PROPERTIES);
|
|
else
|
|
sheet.pszCaption = MAKEINTRESOURCE(IDS_NRULE_DEFINE_PROPERTIES);
|
|
sheet.nPages = 1;
|
|
sheet.nStartPage = 0;
|
|
|
|
CNRulePage *pPage = new CNRulePage(NULL, &out, In); //the "title" becomes the tab header not the window title...
|
|
if (!pPage)
|
|
return -1;
|
|
|
|
if (bReadOnly)
|
|
pPage->SetReadOnly();
|
|
|
|
HPROPSHEETPAGE hPages[1];
|
|
|
|
hPages[0] = pPage->Create();
|
|
|
|
sheet.phpage = &hPages[0];
|
|
sheet.pfnCallback = NULL;
|
|
|
|
INT_PTR id = PropertySheet(&sheet);
|
|
|
|
// CNRulePage pointer pPage does not need to be freed, it has "autodelete", see the templated class it is devired from...
|
|
|
|
if (id > 0)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
CNRulePage::CNRulePage(int nTitle, PCNameRule *OutBuffer, PCNameRule *InData)
|
|
: CMySnapInPropertyPageImpl<CNRulePage>(nTitle), m_bName(_T("")), m_bMask(_T("")), m_bComment(_T("")), m_Type(MATCH_PGM)
|
|
{
|
|
ASSERT(sizeof(PageFields.on) == sizeof(PageFields));
|
|
|
|
PageFields.on = 0;
|
|
m_bReadOnly = FALSE;
|
|
|
|
m_OutBuffer = OutBuffer;
|
|
if (m_OutBuffer)
|
|
memset(m_OutBuffer, 0, sizeof(*m_OutBuffer));
|
|
|
|
if (InData)
|
|
{
|
|
m_bName = InData->procName;
|
|
m_bMask = InData->matchString;
|
|
m_bComment = InData->description;
|
|
m_Type = InData->matchType;
|
|
}
|
|
|
|
m_hBtnImage = NULL;
|
|
|
|
m_psp.dwFlags |= PSP_HASHELP;
|
|
}
|
|
|
|
CNRulePage::~CNRulePage()
|
|
{
|
|
if (m_hBtnImage)
|
|
VERIFY(::DestroyIcon( (HICON) m_hBtnImage));
|
|
|
|
if (m_hMenu)
|
|
VERIFY( ::DestroyMenu(m_hMenu) );
|
|
}
|
|
|
|
|
|
LRESULT CNRulePage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
m_hBtnImage = ::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_RARROW), IMAGE_ICON, 6, 7, LR_DEFAULTCOLOR );
|
|
ASSERT(m_hBtnImage);
|
|
if (m_hBtnImage)
|
|
SendDlgItemMessage(IDC_BTN_ALIAS, BM_SETIMAGE, IMAGE_ICON, (LPARAM) m_hBtnImage);
|
|
m_hMenu = ::LoadMenu( _Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_ALIAS_MACRO) );
|
|
ASSERT(m_hMenu);
|
|
|
|
SendDlgItemMessage( IDC_NAME, EM_SETLIMITTEXT, PROC_NAME_LEN, 0);
|
|
SendDlgItemMessage( IDC_MATCHMASK, EM_SETLIMITTEXT, MATCH_STRING_LEN, 0);
|
|
SendDlgItemMessage( IDC_COMMENT, EM_SETLIMITTEXT, NAME_DESCRIPTION_LEN, 0);
|
|
|
|
if (m_bReadOnly)
|
|
{
|
|
UINT ids[] = { IDC_DIR, IDC_IMAGE, IDC_STRING, IDC_NAME, IDC_MATCHMASK, IDC_COMMENT, IDC_BTN_ALIAS, 0 };
|
|
|
|
for (int i = 0; ids[i]; i++)
|
|
DisableControl(ids[i]);
|
|
}
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE; // Let the system set the focus
|
|
}
|
|
|
|
LRESULT CNRulePage::OnWMHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
HELPINFO *phi = (HELPINFO*) lParam;
|
|
if (phi && phi->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
IDCsToIDHs HelpMap[] = {{IDC_MATCHTYPE_FRAME, HELP_NRULE_MATCHTYPE_FRAME},
|
|
{IDC_DIR, HELP_NRULE_DIR},
|
|
{IDC_IMAGE, HELP_NRULE_IMAGE},
|
|
{IDC_STRING, HELP_NRULE_STRING},
|
|
{IDC_MATCHMASK, HELP_NRULE_MATCHMASK},
|
|
{IDC_COMMENT, HELP_NRULE_COMMENT},
|
|
{IDC_NAME, HELP_NRULE_NAME},
|
|
{IDC_BTN_ALIAS, HELP_NRULE_BTN_ALIAS},
|
|
{0,0} };
|
|
|
|
::WinHelp((HWND) phi->hItemHandle, ContextHelpFile, HELP_WM_HELP, (DWORD_PTR) &HelpMap);
|
|
//ATLTRACE(_T("Call to WinHelp(hwnd=0x%lX) failed %lu"), phi->hItemHandle, GetLastError() );
|
|
|
|
return TRUE;
|
|
}
|
|
bHandled = FALSE;
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNRulePage::OnHelp()
|
|
{
|
|
MMCPropertyHelp(const_cast<TCHAR*>(HELP_ru_alias));
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNRulePage::Validate(BOOL bSave)
|
|
{
|
|
CComBSTR bNameStr;
|
|
CComBSTR bMaskStr;
|
|
CComBSTR bCommentStr;
|
|
MATCH_TYPE TempType;
|
|
|
|
if (!GetDlgItemText( IDC_MATCHMASK, bMaskStr.m_str ) || !bMaskStr.Length() || bMaskStr.Length() > MATCH_STRING_LEN)
|
|
{
|
|
HWND hWndCtl = GetDlgItem(IDC_MATCHMASK);
|
|
if(hWndCtl)
|
|
::SetFocus(hWndCtl);
|
|
MessageBeep(MB_ICONASTERISK);
|
|
return FALSE;
|
|
}
|
|
|
|
if (!GetDlgItemText( IDC_NAME, bNameStr.m_str ) ||
|
|
!IsValidName(bNameStr, FALSE) )
|
|
{
|
|
HWND hWndCtl = GetDlgItem(IDC_NAME);
|
|
if(hWndCtl)
|
|
::SetFocus(hWndCtl);
|
|
|
|
ITEM_STR strOut;
|
|
LoadStringHelper(strOut, IDS_JOBNAME_WARNING);
|
|
MessageBox(strOut, NULL, MB_OK | MB_ICONWARNING);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
// comment/description field can be left blank...
|
|
if ( !GetDlgItemText(IDC_COMMENT, bCommentStr.m_str))
|
|
bCommentStr = _T("");
|
|
if (bCommentStr.Length() > NAME_DESCRIPTION_LEN)
|
|
{
|
|
HWND hWndCtl = GetDlgItem(IDC_COMMENT);
|
|
if(hWndCtl)
|
|
::SetFocus(hWndCtl);
|
|
MessageBeep(MB_ICONASTERISK);
|
|
return FALSE;
|
|
}
|
|
|
|
if ( IsDlgButtonChecked(IDC_IMAGE) )
|
|
TempType = MATCH_PGM;
|
|
else if ( IsDlgButtonChecked(IDC_DIR) )
|
|
TempType = MATCH_DIR;
|
|
else if ( IsDlgButtonChecked(IDC_STRING) )
|
|
TempType = MATCH_ANY;
|
|
else
|
|
{
|
|
MessageBeep(MB_ICONASTERISK);
|
|
return FALSE;
|
|
}
|
|
|
|
if (bSave)
|
|
{
|
|
if (m_OutBuffer)
|
|
{
|
|
_tcscpy(m_OutBuffer->procName, bNameStr);
|
|
_tcscpy(m_OutBuffer->matchString, bMaskStr);
|
|
_tcscpy(m_OutBuffer->description, bCommentStr);
|
|
m_OutBuffer->matchType = TempType;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
BOOL CNRulePage::UpdateData(BOOL bSaveAndValidate)
|
|
{
|
|
|
|
if (bSaveAndValidate)
|
|
{
|
|
return Validate(TRUE);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(IDC_DIR + 1 == IDC_IMAGE && IDC_IMAGE + 1 == IDC_STRING);
|
|
|
|
VERIFY(SetDlgItemText( IDC_NAME, m_bName.m_str ));
|
|
VERIFY(SetDlgItemText( IDC_MATCHMASK, m_bMask.m_str ));
|
|
VERIFY(SetDlgItemText( IDC_COMMENT, m_bComment.m_str ));
|
|
CheckRadioButton(IDC_DIR, IDC_STRING, MatchTypeToID(m_Type) );
|
|
|
|
// save a copy to output buffer, if the page is readonly the output
|
|
// will be the same as the initialzed values
|
|
if (m_OutBuffer)
|
|
{
|
|
_tcscpy(m_OutBuffer->procName, m_bName);
|
|
_tcscpy(m_OutBuffer->matchString, m_bMask);
|
|
_tcscpy(m_OutBuffer->description, m_bComment);
|
|
m_OutBuffer->matchType = m_Type;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
LRESULT CNRulePage::OnEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
CComBSTR bStr; // GetDlgItemText returns FALSE, and doesn't create an empty
|
|
switch (wID) {
|
|
case IDC_NAME:
|
|
if (! GetDlgItemText(wID, bStr.m_str) )
|
|
bStr = _T("");
|
|
PageFields.Fields.matchname = (0 != _tcscmp(bStr, m_bName));
|
|
break;
|
|
case IDC_MATCHMASK:
|
|
if (! GetDlgItemText(wID, bStr.m_str) )
|
|
bStr = _T("");
|
|
PageFields.Fields.matchmask = (0 != _tcscmp(bStr, m_bMask));
|
|
break;
|
|
case IDC_COMMENT:
|
|
if (! GetDlgItemText(wID, bStr.m_str) )
|
|
bStr = _T("");
|
|
PageFields.Fields.comment = (0 != _tcscmp(bStr, m_bComment));
|
|
break;
|
|
default:
|
|
ASSERT(FALSE); //
|
|
break;
|
|
}
|
|
|
|
SetModified(PageFields.on);
|
|
|
|
bHandled = FALSE;
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CNRulePage::OnAliasMacro(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
if (wNotifyCode == BN_CLICKED && wID == IDC_BTN_ALIAS)
|
|
{
|
|
HMENU hSubMenu;
|
|
|
|
if (m_hMenu && (hSubMenu = GetSubMenu(m_hMenu, 0)) )
|
|
{
|
|
CComBSTR bStrName;
|
|
|
|
if (!GetDlgItemText( IDC_NAME, bStrName.m_str ) )
|
|
bStrName = _T("");
|
|
|
|
MENUITEMINFO info = { 0 };
|
|
info.cbSize = sizeof(info);
|
|
info.fMask = MIIM_STATE;
|
|
info.fState = MFS_ENABLED;
|
|
|
|
UINT nItems[] = {IDM_DIR, IDM_IMAGE, IDM_HIDE };
|
|
|
|
// enable all items
|
|
for (int i = 0; i < ARRAY_SIZE(nItems); i++)
|
|
{
|
|
VERIFY( SetMenuItemInfo(hSubMenu, nItems[i], FALSE, &info) );
|
|
}
|
|
|
|
// now disable selective options if not allowed...
|
|
|
|
// if not a sub-dir match disable <d> macro...
|
|
if ( !IsDlgButtonChecked(IDC_DIR) )
|
|
{
|
|
info.fState = MFS_GRAYED;
|
|
VERIFY( SetMenuItemInfo(hSubMenu, IDM_DIR, FALSE, &info) );
|
|
}
|
|
|
|
if ( _tcsstr(bStrName, COPY_PGM_NAME) )
|
|
{
|
|
info.fState = MFS_GRAYED;
|
|
VERIFY( SetMenuItemInfo(hSubMenu, IDM_IMAGE, FALSE, &info) );
|
|
}
|
|
|
|
if ( _tcsstr(bStrName, HIDE_THIS_PROC) )
|
|
{
|
|
info.fState = MFS_GRAYED;
|
|
VERIFY( SetMenuItemInfo(hSubMenu, IDM_HIDE, FALSE, &info) );
|
|
}
|
|
|
|
if ( _tcsstr(bStrName, COPY_DIR_NAME) )
|
|
{
|
|
info.fState = MFS_GRAYED;
|
|
VERIFY( SetMenuItemInfo(hSubMenu, IDM_DIR, FALSE, &info) );
|
|
}
|
|
|
|
|
|
HWND hwndp = ::GetParent(m_hWnd); // the property page is still a child window, so get it's parent...the sheet
|
|
|
|
RECT rect = { 0 }; // button's rect
|
|
TPMPARAMS tpmparams = { 0 }; // use rect of assigned name edit control window
|
|
|
|
tpmparams.cbSize = sizeof(tpmparams);
|
|
|
|
VERIFY( ::GetWindowRect(GetDlgItem(IDC_BTN_ALIAS), &rect ) );
|
|
VERIFY( ::GetWindowRect(GetDlgItem(IDC_NAME), &tpmparams.rcExclude) );
|
|
|
|
TCHAR *txt = NULL;
|
|
|
|
int mID = TrackPopupMenuEx(hSubMenu,
|
|
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD | TPM_VERTICAL,
|
|
rect.right, rect.top, hwndp, &tpmparams);
|
|
|
|
if (mID == IDM_IMAGE)
|
|
txt = COPY_PGM_NAME;
|
|
else if (mID == IDM_HIDE)
|
|
txt = HIDE_THIS_PROC;
|
|
else if (mID == IDM_DIR)
|
|
txt = COPY_DIR_NAME;
|
|
|
|
if (txt)
|
|
SendDlgItemMessage(IDC_NAME, EM_REPLACESEL, TRUE, (LPARAM) txt);
|
|
|
|
}
|
|
}
|
|
|
|
bHandled = FALSE;
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CNRulePage::OnMaskTypeEdit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
if (wNotifyCode == BN_CLICKED)
|
|
{
|
|
switch (wID) {
|
|
case IDC_IMAGE:
|
|
PageFields.Fields.matchtype = (m_Type != MATCH_PGM);
|
|
break;
|
|
case IDC_DIR:
|
|
PageFields.Fields.matchtype = (m_Type != MATCH_DIR);
|
|
break;
|
|
case IDC_STRING:
|
|
PageFields.Fields.matchtype = (m_Type != MATCH_ANY);
|
|
break;
|
|
default:
|
|
PageFields.Fields.matchtype = 0;
|
|
ASSERT(FALSE); //
|
|
break;
|
|
}
|
|
SetModified(PageFields.on);
|
|
}
|
|
|
|
if ( !IsDlgButtonChecked(IDC_DIR) )
|
|
{
|
|
CComBSTR bStr;
|
|
if ( GetDlgItemText(IDC_NAME, bStr.m_str) )
|
|
{
|
|
tstring tname(bStr.m_str);
|
|
|
|
tstring::size_type sub = tname.find(COPY_DIR_NAME);
|
|
|
|
if (sub != tstring::npos)
|
|
{
|
|
tname.erase(sub, _tcslen(COPY_DIR_NAME));
|
|
SetDlgItemText(IDC_NAME, tname.c_str());
|
|
}
|
|
}
|
|
}
|
|
|
|
bHandled = FALSE;
|
|
return 0;
|
|
}
|
|
|
|
BOOL CNRulePage::OnApply()
|
|
{
|
|
if (m_bReadOnly || !PageFields.on)
|
|
return TRUE;
|
|
|
|
if (m_OutBuffer)
|
|
{
|
|
m_bName = m_OutBuffer->procName;
|
|
m_bMask = m_OutBuffer->matchString;
|
|
m_bComment = m_OutBuffer->description;
|
|
m_Type = m_OutBuffer->matchType;
|
|
|
|
PageFields.on = 0;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|