|
|
//
// select.cpp : Implementation of the common select dialog.
//
// Cory West <[email protected]>
// 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 ) { CThemeContextActivator activator;
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 ) { // NTRAID#NTBUG9-477267-2001/10/19-lucios
CWnd *remove = GetParent()->GetDlgItem( m_nRemoveBtnID ); ASSERT(remove != NULL); if(fEnableRemove) remove->EnableWindow(true); else { // so that we don't disable the current
// focused window
if (GetFocus()==remove) { CDialog *father=(CDialog*)remove->GetParent(); ASSERT(father != NULL); CWnd *prev=father->GetNextDlgTabItem(remove,true); ASSERT(prev != NULL); father->GotoDlgCtrl(prev); } remove->EnableWindow(false); } } }
|