home *** CD-ROM | disk | FTP | other *** search
- // InsertControlDlg.Cpp : implementation file
- //
-
- #include "StdAfx.H"
- #include "TestCon.H"
- #include "Resource.HM"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CInsertControlDlg dialog
-
-
- CInsertControlDlg::CInsertControlDlg( CWnd* pParent ) :
- CDialog( CInsertControlDlg::IDD, pParent ),
- m_clsid( CLSID_NULL )
- {
- //{{AFX_DATA_INIT(CInsertControlDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- }
-
-
- void CInsertControlDlg::DoDataExchange(CDataExchange* pDX)
- {
- int iItem;
- POSITION posControl;
-
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CInsertControlDlg)
- DDX_Control(pDX, IDC_SERVERPATH, m_staticServerPath);
- DDX_Control(pDX, IDC_REQUIREDCATEGORIES, m_butRequiredCategories);
- DDX_Control(pDX, IDC_IGNOREREQUIREDCATEGORIES, m_butIgnoreRequiredCategories);
- DDX_Control(pDX, IDOK, m_butOK);
- DDX_Control(pDX, IDC_CONTROLS, m_lbControls);
- //}}AFX_DATA_MAP
-
- if( pDX->m_bSaveAndValidate )
- {
- iItem = m_lbControls.GetCurSel();
- if( iItem == LB_ERR )
- {
- m_clsid = CLSID_NULL;
- }
- else
- {
- posControl = POSITION( m_lbControls.GetItemDataPtr( iItem ) );
- ASSERT( posControl != NULL );
- m_clsid = m_lControls.GetAt( posControl );
- }
- }
- }
-
-
- BEGIN_MESSAGE_MAP(CInsertControlDlg, CDialog)
- //{{AFX_MSG_MAP(CInsertControlDlg)
- ON_BN_CLICKED(IDC_IMPLEMENTEDCATEGORIES, OnImplementedCategories)
- ON_LBN_DBLCLK(IDC_CONTROLS, OnControlsDblClk)
- ON_BN_CLICKED(IDC_REQUIREDCATEGORIES, OnRequiredCategories)
- ON_LBN_SELCHANGE(IDC_CONTROLS, OnControlsSelChange)
- ON_BN_CLICKED(IDC_IGNOREREQUIREDCATEGORIES, OnIgnoreRequiredCategories)
- ON_WM_HELPINFO()
- ON_WM_CONTEXTMENU()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CInsertControlDlg message handlers
-
- BOOL CInsertControlDlg::OnInitDialog()
- {
- HRESULT hResult;
- CATID catid;
-
- hResult = m_pCatInfo.CreateInstance( CLSID_StdComponentCategoriesMgr, NULL,
- CLSCTX_INPROC_SERVER );
- if( FAILED( hResult ) )
- {
- TRACE( "Failed to create category manager\n" );
- EndDialog( IDCANCEL );
- return( TRUE );
- }
-
- CDialog::OnInitDialog();
-
- catid = CATID_Control;
- m_aImplementedCategories.Add( catid );
-
- m_butIgnoreRequiredCategories.SetCheck( 0 );
-
- m_lbControls.ModifyStyle( 0, WS_HSCROLL );
-
- RefreshControlList();
-
- m_lbControls.SetFocus();
-
- return( FALSE );
- }
-
- void GetClassServerPath( REFCLSID clsid, CString& strServerPath )
- {
- HKEY hKey;
- HKEY hServerKey;
- OLECHAR szCLSID[64];
- LONG nResult;
- ULONG nBytes;
- DWORD dwType;
- LPTSTR pszServerPath;
-
- StringFromGUID2( clsid, szCLSID, 64 );
-
- hKey = NULL;
- hServerKey = NULL;
- try
- {
- nResult = RegOpenKeyEx( HKEY_CLASSES_ROOT, CString( "CLSID\\" )+CString(
- szCLSID ), 0, KEY_READ, &hKey );
- if( nResult != ERROR_SUCCESS )
- {
- throw( E_FAIL );
- }
-
- nResult = RegOpenKeyEx( hKey, _T( "InprocServer32" ), 0, KEY_READ,
- &hServerKey );
- if( nResult != ERROR_SUCCESS )
- {
- nResult = RegOpenKeyEx( hKey, _T( "InprocHandler32" ), 0, KEY_READ,
- &hServerKey );
- if( nResult != ERROR_SUCCESS )
- {
- nResult = RegOpenKeyEx( hKey, _T( "LocalServer32" ), 0, KEY_READ,
- &hServerKey );
- if( nResult != ERROR_SUCCESS )
- {
- throw( E_FAIL );
- }
- }
- }
-
- nBytes = 0;
- nResult = RegQueryValueEx( hServerKey, NULL, NULL, &dwType, NULL,
- &nBytes );
- if( (nResult != ERROR_SUCCESS) || (dwType != REG_SZ) )
- {
- throw( E_FAIL );
- }
- pszServerPath = LPTSTR( _alloca( nBytes ) );
- nResult = RegQueryValueEx( hServerKey, NULL, NULL, &dwType,
- LPBYTE( pszServerPath ), &nBytes );
- if( (nResult != ERROR_SUCCESS) || (dwType != REG_SZ) )
- {
- throw( E_FAIL );
- }
-
- strServerPath = pszServerPath;
-
- RegCloseKey( hKey );
- hKey = NULL;
- RegCloseKey( hServerKey );
- hServerKey = NULL;
- }
- catch( HRESULT )
- {
- if( hKey != NULL )
- {
- RegCloseKey( hKey );
- }
- if( hServerKey != NULL )
- {
- RegCloseKey( hServerKey );
- }
-
- strServerPath.LoadString( IDS_SERVERNOTFOUND );
-
- return;
- }
- }
-
- void CInsertControlDlg::RefreshControlList()
- {
- BOOL tDone;
- HRESULT hResult;
- IEnumGUIDPtr pEnum;
- ULONG nImplementedCategories;
- CATID* pcatidImpl;
- ULONG nRequiredCategories;
- CATID* pcatidReq;
- CLSID clsid;
- LPOLESTR pszName;
- CString strName;
- ULONG iCategory;
- int iItem;
- POSITION posControl;
- CString strServerPath;
- CString strString;
-
- m_lbControls.ResetContent();
- m_lControls.RemoveAll();
-
- nImplementedCategories = m_aImplementedCategories.GetSize();
- if( nImplementedCategories == 0 )
- {
- nImplementedCategories = ULONG( -1 );
- pcatidImpl = NULL;
- }
- else
- {
- pcatidImpl = (CATID*)_alloca( nImplementedCategories*sizeof( CATID ) );
- for( iCategory = 0; iCategory < nImplementedCategories; iCategory++ )
- {
- pcatidImpl[iCategory] = m_aImplementedCategories[iCategory];
- }
- }
-
- if( m_butIgnoreRequiredCategories.GetCheck() )
- {
- nRequiredCategories = ULONG( -1 );
- pcatidReq = NULL;
- }
- else
- {
- nRequiredCategories = m_aRequiredCategories.GetSize();
- if( nRequiredCategories == 0 )
- {
- pcatidReq = NULL;
- }
- else
- {
- pcatidReq = (CATID*)_alloca( nRequiredCategories*sizeof( CATID ) );
- for( iCategory = 0; iCategory < nRequiredCategories; iCategory++ )
- {
- pcatidReq[iCategory] = m_aRequiredCategories[iCategory];
- }
- }
- }
-
- hResult = m_pCatInfo->EnumClassesOfCategories( nImplementedCategories,
- pcatidImpl, nRequiredCategories, pcatidReq, &pEnum );
- if( FAILED( hResult ) )
- {
- return;
- }
-
- tDone = FALSE;
- while( !tDone )
- {
- hResult = pEnum->Next( 1, &clsid, NULL );
- if( hResult == S_OK )
- {
- pszName = NULL;
- hResult = OleRegGetUserType( clsid, USERCLASSTYPE_FULL, &pszName );
- if( SUCCEEDED( hResult ) )
- {
- strName = pszName;
- CoTaskMemFree( pszName );
- pszName = NULL;
- iItem = m_lbControls.AddString( strName );
- posControl = m_lControls.AddTail( clsid );
- m_lbControls.SetItemDataPtr( iItem, posControl );
- }
- }
- else
- {
- tDone = TRUE;
- }
- }
-
- OnControlsSelChange();
- }
-
- void CInsertControlDlg::OnImplementedCategories()
- {
- CComponentCategoriesDlg dlg( IDS_IMPLEMENTEDCATEGORIES );
- int nResult;
- int iCategory;
- POSITION posCategory;
- CATID catid;
-
- for( iCategory = 0; iCategory < m_aImplementedCategories.GetSize();
- iCategory++ )
- {
- dlg.m_lSelectedCategories.AddTail( m_aImplementedCategories[
- iCategory] );
- }
-
- nResult = dlg.DoModal();
- if( nResult != IDOK )
- {
- return;
- }
-
- m_aImplementedCategories.RemoveAll();
- posCategory = dlg.m_lSelectedCategories.GetHeadPosition();
- while( posCategory != NULL )
- {
- catid = dlg.m_lSelectedCategories.GetNext( posCategory );
- m_aImplementedCategories.Add( catid );
- }
-
- RefreshControlList();
- }
-
- void CInsertControlDlg::OnControlsDblClk()
- {
- OnOK();
- }
-
- void CInsertControlDlg::OnRequiredCategories()
- {
- CComponentCategoriesDlg dlg( IDS_REQUIREDCATEGORIES );
- int nResult;
- int iCategory;
- POSITION posCategory;
- CATID catid;
-
- for( iCategory = 0; iCategory < m_aRequiredCategories.GetSize();
- iCategory++ )
- {
- dlg.m_lSelectedCategories.AddTail( m_aRequiredCategories[iCategory] );
- }
-
- nResult = dlg.DoModal();
- if( nResult != IDOK )
- {
- return;
- }
-
- m_aRequiredCategories.RemoveAll();
- posCategory = dlg.m_lSelectedCategories.GetHeadPosition();
- while( posCategory != NULL )
- {
- catid = dlg.m_lSelectedCategories.GetNext( posCategory );
- m_aRequiredCategories.Add( catid );
- }
-
- RefreshControlList();
- }
-
- void CInsertControlDlg::OnControlsSelChange()
- {
- int iItem;
- POSITION posControl;
- CString strServerPath;
- CLSID clsid;
- CDC dc;
- CFont* pFont;
- LPTSTR pszServerPath;
- CRect rect;
- CFont* pOldFont;
-
- iItem = m_lbControls.GetCurSel();
- if( iItem != LB_ERR )
- {
- m_butOK.EnableWindow( TRUE );
- posControl = POSITION( m_lbControls.GetItemDataPtr( iItem ) );
- clsid = m_lControls.GetAt( posControl );
- GetClassServerPath( clsid, strServerPath );
-
- dc.CreateCompatibleDC( NULL );
-
- pFont = m_staticServerPath.GetFont();
- pOldFont = dc.SelectObject( pFont );
-
- // Workaround for SHLWAPI bug (in weird cases, PathCompactPath actually
- // expands the pathname)
- pszServerPath = strServerPath.GetBuffer( MAX_PATH+2 );
- m_staticServerPath.GetWindowRect( &rect );
- PathCompactPath( dc, pszServerPath, rect.Width() );
- strServerPath.ReleaseBuffer();
-
- dc.SelectObject( pOldFont );
-
- m_staticServerPath.SetWindowText( strServerPath );
- }
- else
- {
- m_butOK.EnableWindow( FALSE );
- m_staticServerPath.SetWindowText( NULL );
- }
- }
-
- void CInsertControlDlg::OnIgnoreRequiredCategories()
- {
- RefreshControlList();
-
- if( m_butIgnoreRequiredCategories.GetCheck() )
- {
- m_butRequiredCategories.EnableWindow( FALSE );
- }
- else
- {
- m_butRequiredCategories.EnableWindow( TRUE );
- }
- }
-
- static DWORD rgmapCHID[] =
- {
- IDC_CONTROLS, HIDC_CONTROLS,
- IDC_IMPLEMENTEDCATEGORIES, HIDC_IMPLEMENTEDCATEGORIES,
- IDC_REQUIREDCATEGORIES, HIDC_REQUIREDCATEGORIES,
- IDC_IGNOREREQUIREDCATEGORIES, HIDC_IGNOREREQUIREDCATEGORIES,
- 0, 0
- };
-
- BOOL CInsertControlDlg::OnHelpInfo( HELPINFO* pHelpInfo )
- {
- return( ::WinHelp( HWND( pHelpInfo->hItemHandle ),
- AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, DWORD( LPVOID(
- rgmapCHID ) ) ) );
- }
-
- void CInsertControlDlg::OnContextMenu( CWnd* pWnd, CPoint /* point */ )
- {
- ::WinHelp( HWND( *pWnd ), AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU,
- DWORD( LPVOID( rgmapCHID ) ) );
- }
-