WindowsXP-SP1/admin/snapin/schmmgmt/select.cpp
2020-09-30 16:53:49 +02:00

383 lines
9.9 KiB
C++

//
// select.cpp : Implementation of the common select dialog.
//
// Cory West <corywest@microsoft.com>
// Copyright (c) Microsoft Corporation 1997
//
#include "stdafx.h"
#include "macros.h"
USE_HANDLE_MACROS("SCHMMGMT(compdata.cpp)")
#include "schmutil.h"
#include "cache.h"
#include "select.h"
#include "resource.h"
const DWORD CSchmMgmtSelect::help_map[] =
{
IDC_SCHEMA_LIST, IDH_SCHEMA_LIST,
0,0
};
BEGIN_MESSAGE_MAP(CSchmMgmtSelect, CDialog)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextHelp)
ON_LBN_DBLCLK(IDC_SCHEMA_LIST, OnDblclk)
END_MESSAGE_MAP()
CSchmMgmtSelect::CSchmMgmtSelect(
ComponentData *pScope,
SELECT_TYPE st,
SchemaObject **pSchemaObject
) :
CDialog(IDD_SCHEMA_SELECT, NULL),
fDialogLoaded( FALSE ),
SelectType( st ),
pSchemaTarget( pSchemaObject ),
pScopeControl( pScope )
{
ASSERT( NULL != pScopeControl );
}
CSchmMgmtSelect::~CSchmMgmtSelect()
{ ; }
void
CSchmMgmtSelect::DoDataExchange(
CDataExchange *pDX
) {
HWND hSelect;
SchemaObject *pObject, *pHead;
LRESULT strIndex;
WPARAM wStrIndex;
CDialog::DoDataExchange( pDX );
hSelect = ::GetDlgItem( m_hWnd, IDC_SCHEMA_LIST );
if ( !pDX->m_bSaveAndValidate &&
!fDialogLoaded ) {
//
// Load the select box.
//
if ( hSelect != NULL ) {
::SendMessage( hSelect, LB_RESETCONTENT, 0, 0 );
if ( SelectType == SELECT_CLASSES ||
SelectType == SELECT_AUX_CLASSES) {
//
// Insert the sorted classes.
//
pObject = pScopeControl->g_SchemaCache.pSortedClasses;
ASSERT( pObject != NULL );
pHead = pObject;
if( pHead )
{
do {
// if not defunct & if selecting only Aux, is this an aux class.
if ( pObject->isDefunct == FALSE &&
( SelectType != SELECT_AUX_CLASSES ||
pObject->dwClassType == 0 ||
pObject->dwClassType == 3 )
) {
strIndex = ::SendMessage( hSelect, LB_ADDSTRING, 0,
reinterpret_cast<LPARAM>( (LPCTSTR)pObject->ldapDisplayName) );
if ( ( strIndex != LB_ERR ) &&
( strIndex != LB_ERRSPACE ) ) {
//
// The insert was successful. Associate the pointer.
//
wStrIndex = strIndex;
::SendMessage( hSelect, LB_SETITEMDATA, wStrIndex,
reinterpret_cast<LPARAM>( pObject ) );
}
}
pObject = pObject->pSortedListFlink;
} while ( pObject != pHead );
}
} else {
//
// Insert the sorted attributes.
//
pObject = pScopeControl->g_SchemaCache.pSortedAttribs;
ASSERT( pObject != NULL );
pHead = pObject;
do {
if ( pObject->isDefunct == FALSE ) {
strIndex = ::SendMessage( hSelect, LB_ADDSTRING, 0,
reinterpret_cast<LPARAM>( (LPCTSTR)pObject->ldapDisplayName ) );
if ( ( strIndex != LB_ERR ) &&
( strIndex != LB_ERRSPACE ) ) {
//
// The insert was successful. Associate the pointer.
//
wStrIndex = strIndex;
::SendMessage( hSelect, LB_SETITEMDATA, wStrIndex,
reinterpret_cast<LPARAM>( pObject ) );
}
}
pObject = pObject->pSortedListFlink;
} while ( pObject != pHead );
}
::SendMessage( hSelect, LB_SETCURSEL, 0, 0 );
}
fDialogLoaded = TRUE;
}
//
// Figure out which one was selected.
//
if ( pSchemaTarget ) {
strIndex = ::SendMessage( hSelect, LB_GETCURSEL, 0, 0 );
*pSchemaTarget = reinterpret_cast<SchemaObject*>(
::SendMessage( hSelect, LB_GETITEMDATA, strIndex, 0 ) );
}
return;
}
void CSchmMgmtSelect::OnDblclk()
{
OnOK();
}
CSchemaObjectsListBox::CSchemaObjectsListBox() :
m_pScope ( NULL ),
m_stType ( SELECT_CLASSES ),
m_nRemoveBtnID ( 0 ),
m_pstrlistUnremovable ( NULL ),
m_nUnableToDeleteID ( 0 ),
m_fModified ( FALSE )
{
}
CSchemaObjectsListBox::~CSchemaObjectsListBox()
{
POSITION pos = m_stringList.GetHeadPosition();
while( pos != NULL )
{
delete m_stringList.GetNext( pos );
}
m_stringList.RemoveAll();
}
void CSchemaObjectsListBox::InitType(
ComponentData * pScope,
SELECT_TYPE stType, /* = SELECT_CLASSES*/
int nRemoveBtnID, /* = 0*/
CStringList * pstrlistUnremovable, /* = NULL*/
int nUnableToDeleteID) /* = 0*/
{
ASSERT( pScope );
// if nUnableToDeleteID is present, pstrlistUnremovable cannot be NULL
ASSERT( nUnableToDeleteID ? NULL != pstrlistUnremovable : TRUE );
m_pScope = pScope;
m_stType = stType;
m_nRemoveBtnID = nRemoveBtnID;
m_pstrlistUnremovable = pstrlistUnremovable;
m_nUnableToDeleteID = nUnableToDeleteID;
}
//
// Add a new object to the listbox.
//
BOOL CSchemaObjectsListBox::AddNewObjectToList( void )
{
ASSERT( m_pScope ); // initialized??
SchemaObject * pClass = NULL;
BOOL fModified = FALSE;
//
// Start the common select dialog box.
//
CSchmMgmtSelect dlgSelectDialog( m_pScope, m_stType, &pClass );
//
// When this returns, the class schema object pointer
// will be filled into pClass.
//
if ( IDOK == dlgSelectDialog.DoModal() && pClass != NULL )
{
//
// If it is not already present, add and select it.
// If it is already present, just select it.
//
int iItem = FindStringExact( -1, pClass->ldapDisplayName );
if (LB_ERR == iItem)
{
iItem = FindStringExact( -1, pClass->oid );
if ( LB_ERR == iItem )
{
iItem = AddString( pClass->ldapDisplayName );
ASSERT( LB_ERR != iItem );
CString * pstr = new CString( pClass->oid );
ASSERT( pstr );
m_stringList.AddTail( pstr );
VERIFY( LB_ERR != SetItemDataPtr( iItem, static_cast<void *>(pstr) ) );
SetModified();
fModified = TRUE;
}
}
iItem = SetCurSel( iItem );
ASSERT( LB_ERR != iItem );
OnSelChange();
}
return fModified;
}
BOOL CSchemaObjectsListBox::RemoveListBoxItem( void )
{
ASSERT(m_pScope);
int i = GetCurSel();
ASSERT( LB_ERR != i );
if( LB_ERR != i )
{
// if there is an oid string allocated, delete it.
CString * pstr = reinterpret_cast<CString *>( GetItemDataPtr( i ) );
ASSERT( INVALID_POINTER != pstr );
if( pstr && INVALID_POINTER != pstr )
{
ASSERT( m_stringList.Find( pstr ) );
m_stringList.RemoveAt( m_stringList.Find(pstr) );
delete pstr;
}
VERIFY( LB_ERR != DeleteString( i ) );
int nElems = GetCount();
ASSERT( LB_ERR != nElems );
if( nElems > 0 )
{ // if not last item, move forward, otherwise, go to last.
VERIFY( LB_ERR != SetCurSel( i < nElems ? i : nElems - 1 ) );
}
SetModified();
OnSelChange();
return TRUE;
}
else
{
ASSERT( FALSE ); // remove btn should've been disabled
OnSelChange();
return FALSE;
}
}
void CSchemaObjectsListBox::OnSelChange( void )
{
ASSERT(m_pScope);
ASSERT( GetParent() );
int iItemSelected = GetCurSel();
BOOL fEnableRemove = (LB_ERR != iItemSelected);
if (fEnableRemove && m_pstrlistUnremovable)
{
// determine if object is in the exception list
CString strItemSelected;
GetText( iItemSelected, strItemSelected );
// here the case sensitive search is enough
// only items from the DS are added, no user input
if ( m_pstrlistUnremovable->Find( strItemSelected ) )
{
fEnableRemove = FALSE;
}
// if we have a warning control, show/hide it.
if( m_nUnableToDeleteID )
{
ASSERT( GetParent()->GetDlgItem( m_nUnableToDeleteID ) );
GetParent()->GetDlgItem( m_nUnableToDeleteID )->ShowWindow( !fEnableRemove );
}
}
if( m_nRemoveBtnID )
{
ASSERT( GetParent()->GetDlgItem( m_nRemoveBtnID ) );
GetParent()->GetDlgItem( m_nRemoveBtnID )->EnableWindow( fEnableRemove );
}
}