TCDOC.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:36k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // CTestContainer98Doc.cpp : implementation of the CTestContainer98Doc class
  2. //
  3. #include "StdAfx.H"
  4. #include "TestCon.H"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CTestContainer98Doc
  12. IMPLEMENT_DYNCREATE( CTestContainer98Doc, COleDocument )
  13. BEGIN_MESSAGE_MAP(CTestContainer98Doc, COleDocument)
  14. //{{AFX_MSG_MAP(CTestContainer98Doc)
  15. ON_COMMAND(ID_OPTIONS_FREEZEEVENTS, OnOptionsFreezeEvents)
  16. ON_UPDATE_COMMAND_UI(ID_OPTIONS_FREEZEEVENTS, OnUpdateOptionsFreezeEvents)
  17. ON_COMMAND(ID_OPTIONS_SLOWDRAWING, OnOptionsSlowDrawing)
  18. ON_UPDATE_COMMAND_UI(ID_OPTIONS_SLOWDRAWING, OnUpdateOptionsSlowDrawing)
  19. ON_COMMAND(ID_OPTIONS_TWOPASSDRAWING, OnOptionsTwoPassDrawing)
  20. ON_UPDATE_COMMAND_UI(ID_OPTIONS_TWOPASSDRAWING, OnUpdateOptionsTwoPassDrawing)
  21. ON_COMMAND(ID_OPTIONS_LOGGING, OnOptionsLogging)
  22. ON_COMMAND(ID_CONTAINER_OPTIONS, OnContainerOptions)
  23. ON_COMMAND(ID_CONTAINER_AMBIENTPROPERTIES, OnContainerAmbientProperties)
  24. ON_COMMAND(ID_CONTAINER_INFO, OnContainerInfo)
  25. ON_COMMAND(ID_EDIT_DELETEALL, OnEditDeleteAll)
  26. ON_UPDATE_COMMAND_UI(ID_EDIT_DELETEALL, OnUpdateEditDeleteAll)
  27. ON_COMMAND(ID_CONTAINER_TABORDER, OnContainerTabOrder)
  28. ON_COMMAND(ID_TOOLS_MACROS, OnToolsMacros)
  29. ON_COMMAND(ID_RUNMACRO, OnRunMacro)
  30. //}}AFX_MSG_MAP
  31. // Enable default OLE container implementation
  32. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu)
  33. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu)
  34. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, COleDocument::OnUpdateObjectVerbMenu)
  35. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu)
  36. ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
  37.    ON_UPDATE_COMMAND_UI_RANGE( ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, COleDocument::OnUpdateObjectVerbMenu )
  38. END_MESSAGE_MAP()
  39. BEGIN_CONNECTION_MAP( CTestContainer98Doc, COleDocument )
  40.    CONNECTION_PART( CTestContainer98Doc, __uuidof( ITestContainer98Events ), TC98CP )
  41. END_CONNECTION_MAP()
  42. BEGIN_DISPATCH_MAP( CTestContainer98Doc, COleDocument )
  43. //{{AFX_DISPATCH_MAP(CTestContainer98Doc)
  44. DISP_PROPERTY_EX(CTestContainer98Doc, "PrimarySelection", GetPrimarySelection, SetPrimarySelection, VT_DISPATCH)
  45. DISP_FUNCTION(CTestContainer98Doc, "FindControl", FindControl, VT_DISPATCH, VTS_BSTR)
  46. DISP_FUNCTION(CTestContainer98Doc, "Log", Log, VT_EMPTY, VTS_BSTR)
  47. DISP_FUNCTION(CTestContainer98Doc, "InsertControl", InsertControl, VT_DISPATCH, VTS_BSTR VTS_BSTR)
  48. //}}AFX_DISPATCH_MAP
  49. END_DISPATCH_MAP()
  50. BEGIN_INTERFACE_MAP( CTestContainer98Doc, COleDocument )
  51. INTERFACE_PART( CTestContainer98Doc, __uuidof( ITestContainer98 ), Dispatch )
  52.    INTERFACE_PART( CTestContainer98Doc, IID_IConnectionPointContainer, ConnPtContainer )
  53. END_INTERFACE_MAP()
  54. const IID LIBID_TestContainer98 = {0x198184FB,0xB837,0x11D0,{0x8D,0xF1,0x00,0xC0,0x4F,0xB6,0x8D,0x60}};
  55. IMPLEMENT_OLETYPELIB( CTestContainer98Doc, LIBID_TestContainer98, 1, 0 )
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CTestContainer98Doc construction/destruction
  58. CTestContainer98Doc::CTestContainer98Doc() :
  59.    m_pFontHolder( NULL ),
  60.    m_tUserMode( FALSE ),
  61.    m_tFreezeEvents( FALSE ),
  62.    m_tAllowWindowless( TRUE ),
  63.    m_tTwoPassDrawing( TRUE ),
  64.    m_tSlowDrawing( FALSE ),
  65.    m_tHonorIgnoreActivateWhenVisible( TRUE ),
  66.    m_tUseIPointerInactive( TRUE ),
  67.    m_tUseQuickActivation( TRUE ),
  68.    m_tIOleInPlaceSiteWindowless( TRUE ),
  69.    m_tIOleInPlaceSiteEx( TRUE ),
  70.    m_tIAdviseSinkEx( TRUE ),
  71.    m_tSBindHost( TRUE ),
  72.    m_pLog( NULL ),
  73.    m_pScriptManager( NULL )
  74. {
  75.    m_descFont.lpstrName = NULL;
  76. // Use OLE compound files
  77. EnableCompoundFile();
  78.    EnableConnections();
  79. EnableAutomation();
  80. AfxOleLockApp();
  81. }
  82. CTestContainer98Doc::~CTestContainer98Doc()
  83. {
  84.    Cleanup();
  85. AfxOleUnlockApp();
  86. }
  87. void CTestContainer98Doc::Cleanup()
  88. {
  89.    int iProp;
  90.    if( m_pScriptManager != NULL )
  91.    {
  92.   delete m_pScriptManager;
  93.   m_pScriptManager = NULL;
  94.    }
  95.    delete m_pLog;
  96.    m_pLog = NULL;
  97.    for( iProp = 0; iProp < m_apAmbientProperties.GetSize(); iProp++ )
  98.    {
  99.   delete m_apAmbientProperties[iProp];
  100.    }
  101.    m_apAmbientProperties.SetSize( 0 );
  102.    delete m_pFontHolder;
  103.    m_pFontHolder = NULL;
  104.    delete[] m_descFont.lpstrName;
  105.    m_descFont.lpstrName = NULL;
  106. }
  107. void CTestContainer98Doc::CreateUniqueItemName( CTestContainer98Item* pItem,
  108.    LPCTSTR pszBaseName, CString& strUniqueName )
  109. {
  110.    POSITION posItem;
  111.    CTestContainer98Item* pSearchItem;
  112.    ULONG nTag;
  113.    BOOL tCollisionFound;
  114.    ASSERT( pszBaseName != NULL );
  115.    // Assume the name is already unique
  116.    strUniqueName = pszBaseName;
  117.    nTag = 1;
  118.    do
  119.    {
  120.   tCollisionFound = FALSE;
  121.   posItem = GetStartPosition();
  122.   while( (posItem != NULL) && !tCollisionFound )
  123.   {
  124.  pSearchItem = (CTestContainer98Item*)GetNextItem( posItem );
  125.  if( pSearchItem != pItem )
  126.  {
  127. if( strUniqueName == pSearchItem->GetDisplayName() )
  128. {
  129.    // This name is already in use.
  130.    tCollisionFound = TRUE;
  131.    strUniqueName.Format( "%s%u", pszBaseName, nTag );
  132.    nTag++;
  133. }
  134.  }
  135.   }
  136.    } while( tCollisionFound );
  137. }
  138. BOOL CTestContainer98Doc::Initialize()
  139. {
  140.    USES_CONVERSION;
  141.    CLSID clsid;
  142.    HRESULT hResult;
  143.    CMainFrame* pMainFrame;
  144.    CTestContainer98App* pApp;
  145.    CFileLog* pFileLog;
  146.    BOOL tSuccess;
  147.    pApp = (CTestContainer98App*)AfxGetApp();
  148.    m_tUserMode = pApp->m_options.m_tUserMode;
  149.    m_tFreezeEvents = FALSE;
  150.    m_tAllowWindowless = pApp->m_options.m_tAllowWindowless;
  151.    m_tTwoPassDrawing = pApp->m_options.m_tTwoPassDrawing;
  152.    m_tSlowDrawing = FALSE;
  153.    m_tHonorIgnoreActivateWhenVisible =
  154.   pApp->m_options.m_tHonorIgnoreActivateWhenVisible;
  155.    m_tUseIPointerInactive = pApp->m_options.m_tUseIPointerInactive;
  156.    m_tUseQuickActivation = pApp->m_options.m_tQuickActivation;
  157.    m_tIOleInPlaceSiteWindowless = pApp->m_options.m_tIOleInPlaceSiteWindowless;
  158.    m_tIOleInPlaceSiteEx = pApp->m_options.m_tIOleInPlaceSiteEx;
  159.    m_tIAdviseSinkEx = pApp->m_options.m_tIAdviseSinkEx;
  160.    m_tSBindHost = pApp->m_options.m_tSBindHost;
  161.    m_pLog = NULL;
  162.    pMainFrame = DYNAMIC_DOWNCAST( CMainFrame, AfxGetMainWnd() );
  163.    switch( pApp->m_options.m_iLogType )
  164.    {
  165.    case TCLOG_NULL:
  166.   m_pLog = new CNullLog;
  167.   break;
  168.    case TCLOG_OUTPUTWINDOW:
  169.   m_pLog = new COutputWindowLog( GetOutputEditControl() );
  170.   break;
  171.    case TCLOG_DEBUG:
  172.   m_pLog = new CDebugLog;
  173.   break;
  174.    case TCLOG_FILE:
  175.   pFileLog = new CFileLog;
  176.   tSuccess = pFileLog->Create( pApp->m_options.m_strLogFileName );
  177.   if( !tSuccess )
  178.   {
  179.  delete pFileLog;
  180.   }
  181.   m_pLog = pFileLog;
  182.   break;
  183.    default:
  184.   ASSERT( FALSE );
  185.   break;
  186.    }
  187.    if( m_pLog == NULL )
  188.    {
  189.   return( FALSE );
  190.    }
  191.    hResult = InitDefaultAmbientProperties();
  192.    if( FAILED( hResult ) )
  193.    {
  194.   return( FALSE );
  195.    }
  196.    if( !pApp->m_options.m_strProgID.IsEmpty() )
  197.    {
  198.   try
  199.   {
  200.  hResult = CLSIDFromProgID( T2COLE( pApp->m_options.m_strProgID ),
  201. &clsid );
  202.  if( FAILED( hResult ) )
  203.  {
  204. AfxThrowOleException( hResult );
  205.  }
  206.  AddControl( clsid, NULL );
  207.   }
  208.   catch( CException* pException )
  209.   {
  210.  pException->Delete();
  211.  TCTrace( TRACELEVEL_NORMAL, "Failed to load control.n" );
  212.   }
  213.   pApp->m_options.m_strProgID.Empty();
  214.    }
  215. return( TRUE );
  216. }
  217. BOOL CTestContainer98Doc::OnNewDocument()
  218. {
  219. if( !COleDocument::OnNewDocument() )
  220.    {
  221.   return( FALSE );
  222.    }
  223.    return( Initialize() );
  224. }
  225. /////////////////////////////////////////////////////////////////////////////
  226. // CTestContainer98Doc serialization
  227. void CTestContainer98Doc::Serialize( CArchive& ar )
  228. {
  229.    POSITION posScript;
  230.    CScript* pScript;
  231.    int nScripts;
  232.    int iScript;
  233.    CString strScriptName;
  234.    CString strScriptPath;
  235.    CScriptManager* pScriptManager;
  236.    CString strErrorMessage;
  237.    HRESULT hResult;
  238.    int iProp;
  239.    CAmbientProperty* pUserMode;
  240.    if( ar.IsLoading() )
  241.    {
  242.   Initialize();
  243.   for( iProp = 0; iProp < m_apAmbientProperties.GetSize(); iProp++ )
  244.   {
  245.  delete m_apAmbientProperties[iProp];
  246.   }
  247.   m_apAmbientProperties.SetSize( 0 );
  248.   m_apAmbientProperties.Serialize( ar );
  249.   pUserMode = FindAmbientProperty( DISPID_AMBIENT_USERMODE );
  250.   if( pUserMode != NULL )
  251.   {
  252.  if( pUserMode->GetValue().vt == VT_BOOL )
  253.  {
  254. m_tUserMode = pUserMode->GetValue().boolVal;
  255.  }
  256.   }
  257.    }
  258.    else
  259.    {
  260.   m_apAmbientProperties.Serialize( ar );
  261.    }
  262. // Calling the base class COleDocument enables serialization
  263. //  of the container document's COleClientItem objects.
  264. COleDocument::Serialize( ar );
  265.    if( ar.IsStoring() )
  266.    {
  267.   pScriptManager = GetScriptManager( FALSE );
  268.   if( pScriptManager != NULL )
  269.   {
  270.  ar<<pScriptManager->GetNumScripts();
  271.  posScript = pScriptManager->GetFirstScriptPosition();
  272.  while( posScript != NULL )
  273.  {
  274. pScript = pScriptManager->GetNextScript( posScript );
  275. ar<<pScript->GetName();
  276.  }
  277.   }
  278.   else
  279.   {
  280.  ar<<int( 0 );
  281.   }
  282.    }
  283.    else
  284.    {
  285.   ar>>nScripts;
  286.   if( nScripts > 0 )
  287.   {
  288.  pScriptManager = GetScriptManager();
  289.  if( pScriptManager != NULL )
  290.  {
  291. for( iScript = 0; iScript < nScripts; iScript++ )
  292. {
  293.    ar>>strScriptName;
  294.    strScriptPath = m_strDirectory+strScriptName+_T( ".dsm" );
  295.    hResult = pScriptManager->LoadScript( strScriptPath,
  296.   strScriptName );
  297.    if( FAILED( hResult ) )
  298.    {
  299.   _com_error error( hResult );
  300.   AfxFormatString2( strErrorMessage, IDS_ERRORLOADINGSCRIPT,
  301.  strScriptName, error.ErrorMessage() );
  302.   AfxMessageBox( strErrorMessage );
  303.    }
  304. }
  305.  }
  306.   }
  307.    }
  308. }
  309. /////////////////////////////////////////////////////////////////////////////
  310. // CTestContainer98Doc diagnostics
  311. #ifdef _DEBUG
  312. void CTestContainer98Doc::AssertValid() const
  313. {
  314. COleDocument::AssertValid();
  315. }
  316. void CTestContainer98Doc::Dump( CDumpContext& dc ) const
  317. {
  318. COleDocument::Dump(dc);
  319. }
  320. #endif //_DEBUG
  321. /////////////////////////////////////////////////////////////////////////////
  322. // CTestContainer98Doc commands
  323. void CTestContainer98Doc::BringToFront( CDocItem* pItem )
  324. {
  325.    POSITION posItem;
  326.    ASSERT( pItem != NULL );
  327.    posItem = m_docItemList.Find( pItem );
  328.    ASSERT( posItem != NULL );
  329.    m_docItemList.RemoveAt( posItem );
  330.    m_docItemList.AddHead( pItem );
  331. }
  332. void CTestContainer98Doc::SendToBack( CDocItem* pItem )
  333. {
  334.    POSITION posItem;
  335.    ASSERT( pItem != NULL );
  336.    posItem = m_docItemList.Find( pItem );
  337.    ASSERT( posItem != NULL );
  338.    m_docItemList.RemoveAt( posItem );
  339.    m_docItemList.AddTail( pItem );
  340. }
  341. HRESULT CTestContainer98Doc::InitDefaultAmbientProperties()
  342. {
  343.    CString strName;
  344.    LPCOLESTR pszFaceName;
  345.    CAmbientProperty* pProp;
  346.    VARIANT_BOOL tUserMode;
  347.    if( m_tUserMode )
  348.    {
  349.   tUserMode = VAR_TRUE;
  350.    }
  351.    else
  352.    {
  353.   tUserMode = VAR_FALSE;
  354.    }
  355.    strName.LoadString( IDS_APROPNAME_USERMODE );
  356.    pProp = new CAmbientProperty( DISPID_AMBIENT_USERMODE, strName, COleVariant(
  357.   tUserMode, VT_BOOL ), VTI_BOOL, TRUE );
  358.    m_apAmbientProperties.Add( pProp );
  359.    strName.LoadString( IDS_APROPNAME_UIDEAD );
  360.    pProp = new CAmbientProperty( DISPID_AMBIENT_UIDEAD, strName, COleVariant(
  361.   VARIANT_FALSE, VT_BOOL ), VTI_BOOL, TRUE );
  362.    m_apAmbientProperties.Add( pProp );
  363.    strName.LoadString( IDS_APROPNAME_SHOWHATCHING );
  364.    pProp = new CAmbientProperty( DISPID_AMBIENT_SHOWHATCHING, strName,
  365.   COleVariant( VARIANT_BOOL( -1 ), VT_BOOL ), VTI_BOOL, TRUE );
  366.    m_apAmbientProperties.Add( pProp );
  367.    strName.LoadString( IDS_APROPNAME_SHOWGRABHANDLES );
  368.    pProp = new CAmbientProperty( DISPID_AMBIENT_SHOWGRABHANDLES, strName,
  369.   COleVariant( VARIANT_BOOL( -1 ), VT_BOOL ), VTI_BOOL, TRUE );
  370.    m_apAmbientProperties.Add( pProp );
  371.    strName.LoadString( IDS_APROPNAME_TEXTALIGN );
  372.    pProp = new CAmbientProperty( DISPID_AMBIENT_TEXTALIGN, strName,
  373.   COleVariant( short( 0 ), VT_I2 ), VTI_I2, TRUE );
  374.    m_apAmbientProperties.Add( pProp );
  375.    strName.LoadString( IDS_APROPNAME_BACKCOLOR );
  376.    pProp = new CAmbientProperty( DISPID_AMBIENT_BACKCOLOR, strName,
  377.   COleVariant( long( GetSysColor( COLOR_WINDOW ) ), VT_I4 ), VTI_COLOR,
  378.   TRUE );
  379.    m_apAmbientProperties.Add( pProp );
  380.    delete m_pFontHolder;
  381.    m_pFontHolder = new CFontHolder( NULL );
  382.    if( m_pFontHolder == NULL )
  383.    {
  384.   AfxThrowMemoryException();
  385.    }
  386.    m_descFont.cbSizeofstruct = sizeof( m_descFont );
  387.    pszFaceName = L"MS Sans Serif";
  388.    delete[] m_descFont.lpstrName;
  389.    m_descFont.lpstrName = new OLECHAR[ocslen( pszFaceName )+1];
  390.    if( m_descFont.lpstrName == NULL )
  391.    {
  392.   AfxThrowMemoryException();
  393.    }
  394.    ocscpy( m_descFont.lpstrName, pszFaceName );
  395.    m_descFont.cySize.Lo = 80000L;
  396.    m_descFont.cySize.Hi = 0;
  397.    m_descFont.sWeight = FW_BOLD;
  398.    m_descFont.sCharset = 0;
  399.    m_descFont.fItalic = FALSE;
  400.    m_descFont.fUnderline = FALSE;
  401.    m_descFont.fStrikethrough = FALSE;
  402.    m_pFontHolder->InitializeFont( &m_descFont );
  403.    COleVariant varFont;
  404.    varFont.vt = VT_DISPATCH;
  405.    varFont.pdispVal = m_pFontHolder->GetFontDispatch();
  406.    strName.LoadString( IDS_APROPNAME_FONT );
  407.    pProp = new CAmbientProperty( DISPID_AMBIENT_FONT, strName, varFont,
  408.   VTI_FONT, TRUE );
  409.    m_apAmbientProperties.Add( pProp );
  410.    strName.LoadString( IDS_APROPNAME_FORECOLOR );
  411.    pProp = new CAmbientProperty( DISPID_AMBIENT_FORECOLOR, strName,
  412.   COleVariant( long( GetSysColor( COLOR_WINDOWTEXT ) ), VT_I4 ), VTI_COLOR,
  413.   TRUE );
  414.    m_apAmbientProperties.Add( pProp );
  415.    strName.LoadString( IDS_APROPNAME_SCALEUNITS );
  416.    pProp = new CAmbientProperty( DISPID_AMBIENT_SCALEUNITS, strName,
  417.   COleVariant( _T( "" ), VT_BSTR ), VTI_BSTR, TRUE );
  418.    m_apAmbientProperties.Add( pProp );
  419.    strName.LoadString( IDS_APROPNAME_DISPLAYNAME );
  420.    pProp = new CAmbientProperty( DISPID_AMBIENT_DISPLAYNAME, strName,
  421.   COleVariant( _T( "" ), VT_BSTR ), VTI_BSTR, TRUE );
  422.    m_apAmbientProperties.Add( pProp );
  423.    strName.LoadString( IDS_APROPNAME_LOCALEID );
  424.    pProp = new CAmbientProperty( DISPID_AMBIENT_LOCALEID, strName, COleVariant(
  425.   long( GetUserDefaultLCID() ), VT_I4 ), VTI_I4, TRUE );
  426.    m_apAmbientProperties.Add( pProp );
  427.    strName.LoadString( IDS_APROPNAME_MESSAGEREFLECT );
  428.    pProp = new CAmbientProperty( DISPID_AMBIENT_MESSAGEREFLECT, strName,
  429.   COleVariant( VARIANT_FALSE, VT_BOOL ), VTI_BOOL, TRUE );
  430.    m_apAmbientProperties.Add( pProp );
  431.    strName.LoadString( IDS_APROPNAME_SUPPORTSMNEMONICS );
  432.    pProp = new CAmbientProperty( DISPID_AMBIENT_SUPPORTSMNEMONICS, strName,
  433.   COleVariant( VARIANT_BOOL( -1 ), VT_BOOL ), VTI_BOOL, TRUE );
  434.    m_apAmbientProperties.Add( pProp );
  435.    return( S_OK );
  436. }
  437. BOOL CTestContainer98Doc::CanWindowlessActivate() const
  438. {
  439.    return( m_tAllowWindowless );
  440. }
  441. BOOL CTestContainer98Doc::UseIPointerInactive() const
  442. {
  443.    return( m_tUseIPointerInactive );
  444. }
  445. BOOL CTestContainer98Doc::UseQuickActivation() const
  446. {
  447.    return( m_tUseQuickActivation );
  448. }
  449. BOOL CTestContainer98Doc::UseSlowDrawing() const
  450. {
  451.    return( m_tSlowDrawing );
  452. }
  453. BOOL CTestContainer98Doc::UseTwoPassDrawing() const
  454. {
  455.    return( m_tTwoPassDrawing );
  456. }
  457. BOOL CTestContainer98Doc::HonorIgnoreActivateWhenVisible() const
  458. {
  459.    return( m_tHonorIgnoreActivateWhenVisible );
  460. }
  461. int CTestContainer98Doc::AddAmbientProperty( DISPID dispid, LPCTSTR pszName,
  462.    const VARIANT& var, int vti )
  463. {
  464.    CAmbientProperty* pProp;
  465.    int iProp;
  466.    pProp = new CAmbientProperty( dispid, pszName, var, vti );
  467.    if( pProp == NULL )
  468.    {
  469.   AfxThrowMemoryException();
  470.    }
  471.    iProp = m_apAmbientProperties.Add( pProp );
  472.    return( iProp );
  473. }
  474. CAmbientProperty* CTestContainer98Doc::FindAmbientProperty( DISPID dispid )
  475. {
  476.    int iProp;
  477.    for( iProp = 0; iProp < m_apAmbientProperties.GetSize(); iProp++ )
  478.    {
  479.   if( m_apAmbientProperties[iProp]->GetID() == dispid )
  480.   {
  481.  return( m_apAmbientProperties[iProp] );
  482.   }
  483.    }
  484.    // We didn't find the property.
  485.    return( NULL );
  486. }
  487. CAmbientProperty* CTestContainer98Doc::FindAmbientProperty( LPCOLESTR pszName )
  488. {
  489.    USES_CONVERSION;
  490.    int iProp;
  491.    LPCTSTR pszNameT;
  492.    pszNameT = OLE2CT( pszName );
  493.    for( iProp = 0; iProp < m_apAmbientProperties.GetSize(); iProp++ )
  494.    {
  495.   if( m_apAmbientProperties[iProp]->GetName() == pszNameT )
  496.   {
  497.  return( m_apAmbientProperties[iProp] );
  498.   }
  499.    }
  500.    // We didn't find the property.
  501.    return( NULL );
  502. }
  503. CAmbientProperty* CTestContainer98Doc::GetAmbientProperty( int iProp )
  504. {
  505.    return( m_apAmbientProperties[iProp] );
  506. }
  507. int CTestContainer98Doc::GetNumAmbientProperties() const
  508. {
  509.    return( m_apAmbientProperties.GetSize() );
  510. }
  511. POSITION CTestContainer98Doc::FindItem( CDocItem* pItem ) const
  512. {
  513.    return( m_docItemList.Find( pItem ) );
  514. }
  515. POSITION CTestContainer98Doc::GetTailPosition() const
  516. {
  517.    return( m_docItemList.GetTailPosition() );
  518. }
  519. CDocItem* CTestContainer98Doc::GetPrevItem( POSITION& pos ) const
  520. {
  521.    return( (CDocItem*)m_docItemList.GetPrev( pos ) );
  522. }
  523. CTestContainer98Item* CTestContainer98Doc::GetNextTabItem(
  524.    CTestContainer98Item* pItem ) const
  525. {
  526.    POSITION posItem;
  527.    if( pItem == NULL )
  528.    {
  529.   if( m_lpTabOrder.IsEmpty() )
  530.   {
  531.  return( NULL );
  532.   }
  533.   return( m_lpTabOrder.GetHead() );
  534.    }
  535.    posItem = m_lpTabOrder.Find( pItem );
  536.    ASSERT( posItem != NULL );
  537.    m_lpTabOrder.GetNext( posItem );
  538.    if( posItem == NULL )
  539.    {
  540.   // Wrap around to the beginning of the list.
  541.   return( m_lpTabOrder.GetHead() );
  542.    }
  543.    return( m_lpTabOrder.GetAt( posItem ) );
  544. }
  545. void CTestContainer98Doc::SetItemTabOrder( CTestContainer98Item* pItem,
  546.    int iTabOrder )
  547. {
  548.    POSITION posItem;
  549.    ASSERT( pItem != NULL );
  550.    posItem = FindItem( pItem );
  551.    ASSERT( posItem != NULL );
  552.    posItem = m_lpTabOrder.Find( pItem );
  553.    ASSERT( posItem != NULL );
  554.    m_lpTabOrder.RemoveAt( posItem );
  555.    posItem = m_lpTabOrder.FindIndex( iTabOrder );
  556.    if( posItem == NULL )
  557.    {
  558.   // We went off the end of the list.
  559.   m_lpTabOrder.AddTail( pItem );
  560.    }
  561.    else
  562.    {
  563.   m_lpTabOrder.InsertBefore( posItem, pItem );
  564.    }
  565. }
  566. BOOL CTestContainer98Doc::GetUserMode() const
  567. {
  568.    return( m_tUserMode );
  569. }
  570. void CTestContainer98Doc::SetUserMode( BOOL tUserMode )
  571. {
  572.    CAmbientProperty* pProp;
  573.    if( (m_tUserMode && tUserMode) || (!m_tUserMode && !tUserMode) )
  574.    {
  575.   // No change
  576.   return;
  577.    }
  578.    m_tUserMode = tUserMode;
  579.    pProp = FindAmbientProperty( DISPID_AMBIENT_USERMODE );
  580.    ASSERT( pProp != NULL );
  581.    if( m_tUserMode )
  582.    {
  583.   pProp->SetValue( COleVariant( VARIANT_BOOL( -1 ), VT_BOOL ) );
  584.    }
  585.    else
  586.    {
  587.   pProp->SetValue( COleVariant( VARIANT_FALSE, VT_BOOL ) );
  588.    }
  589.    if( pProp->IsEnabled() )
  590.    {
  591.   BroadcastAmbientPropertyChange( pProp->GetID() );
  592.    }
  593. }
  594. void CTestContainer98Doc::BroadcastAmbientPropertyChange( DISPID dispid )
  595. {
  596.    POSITION posItem;
  597.    CTestContainer98Item* pItem;
  598.    TCTrace( TRACELEVEL_NORMAL,
  599.   "Broadcasting ambient property change.  DISPID=%dn", dispid );
  600.    posItem = GetStartPosition();
  601.    while( posItem != NULL )
  602.    {
  603.   pItem = (CTestContainer98Item*)GetNextItem( posItem );
  604.   pItem->OnAmbientPropertyChange( dispid );
  605.    }
  606.    if( (dispid == DISPID_AMBIENT_USERMODE) || (dispid == DISPID_UNKNOWN) )
  607.    {
  608.   // Invalidate the view, since some objects need to be rendered
  609.   // differently in design mode vs. user mode.
  610.   UpdateAllViews( NULL );
  611.    }
  612. }
  613. BOOL CTestContainer98Doc::SupportsInterface( REFIID iid )
  614. {
  615.    if( iid == IID_IOleInPlaceSiteEx )
  616.    {
  617.   return( m_tIOleInPlaceSiteEx || m_tIOleInPlaceSiteWindowless );
  618.    }
  619.    else if( iid == IID_IOleInPlaceSiteWindowless )
  620.    {
  621.   return( m_tIOleInPlaceSiteWindowless );
  622.    }
  623.    else if( iid == IID_IAdviseSinkEx )
  624.    {
  625.   return( m_tIAdviseSinkEx );
  626.    }
  627.    return( FALSE );
  628. }
  629. BOOL CTestContainer98Doc::SupportsService( REFGUID sid )
  630. {
  631.    if( sid == SID_SBindHost )
  632.    {
  633.   return( m_tSBindHost );
  634.    }
  635.    return( FALSE );
  636. }
  637. void CTestContainer98Doc::PreCloseFrame( CFrameWnd* pFrame )
  638. {
  639.    POSITION posItem;
  640.    CTestContainer98Item* pItem;
  641.    posItem = GetStartPosition();
  642.    while( posItem != NULL )
  643.    {
  644.   pItem = (CTestContainer98Item*)GetNextItem( posItem );
  645.   if( pItem != NULL )
  646.   {
  647.  if( pItem->IsInPlaceActive() )
  648.  {
  649. pItem->Deactivate();
  650.  }
  651.   }
  652.    }
  653.    COleDocument::PreCloseFrame( pFrame );
  654. }
  655. BOOL CTestContainer98Doc::CanCloseFrame( CFrameWnd* pFrame )
  656. {
  657.    return( COleDocument::CanCloseFrame( pFrame ) );
  658. }
  659. BOOL CTestContainer98Doc::OnSaveDocument( LPCTSTR pszPathName )
  660. {
  661.    return( COleDocument::OnSaveDocument( pszPathName ) );
  662. }
  663. void CTestContainer98Doc::AddItem( CDocItem* pItem )
  664. {
  665. COleDocument::AddItem( pItem );
  666.    m_lpTabOrder.AddTail( (CTestContainer98Item*)pItem );
  667. }
  668. CLog* CTestContainer98Doc::GetLog() const
  669. {
  670.    return( m_pLog );
  671. }
  672. void CTestContainer98Doc::DeleteContents()
  673. {
  674.    Cleanup();
  675. COleDocument::DeleteContents();
  676. }
  677. void CTestContainer98Doc::OnOptionsFreezeEvents()
  678. {
  679.    POSITION posItem;
  680.    CTestContainer98Item* pItem;
  681.    m_tFreezeEvents = !m_tFreezeEvents;
  682.    posItem = GetStartPosition();
  683.    while( posItem != NULL )
  684.    {
  685.   // Set the item's FreezeEvents status.
  686.   pItem = (CTestContainer98Item*)GetNextItem( posItem );
  687.   pItem->FreezeEvents( m_tFreezeEvents );
  688.    }
  689. }
  690. void CTestContainer98Doc::OnUpdateOptionsFreezeEvents( CCmdUI* pCmdUI )
  691. {
  692.    if( m_tFreezeEvents )
  693.    {
  694.   pCmdUI->SetCheck( 1 );
  695.    }
  696.    else
  697.    {
  698.   pCmdUI->SetCheck( 0 );
  699.    }
  700. }
  701. void CTestContainer98Doc::OnOptionsSlowDrawing()
  702. {
  703.    m_tSlowDrawing = !m_tSlowDrawing;
  704. }
  705. void CTestContainer98Doc::OnUpdateOptionsSlowDrawing( CCmdUI* pCmdUI )
  706. {
  707.    pCmdUI->SetCheck( m_tSlowDrawing == TRUE );
  708. }
  709. void CTestContainer98Doc::OnOptionsTwoPassDrawing()
  710. {
  711.    m_tTwoPassDrawing = !m_tTwoPassDrawing;
  712. }
  713. void CTestContainer98Doc::OnUpdateOptionsTwoPassDrawing( CCmdUI* pCmdUI )
  714. {
  715.    pCmdUI->SetCheck( m_tTwoPassDrawing == TRUE );
  716. }
  717. void CTestContainer98Doc::OnOptionsLogging()
  718. {
  719.    CLoggingDlg dlg;
  720.    CFileLog* pFileLog;
  721.    int nResult;
  722.    int iOldLogType;
  723.    BOOL tSuccess;
  724.    if( m_pLog->IsKindOf( RUNTIME_CLASS( CNullLog ) ) )
  725.    {
  726.   dlg.m_iLogType = TCLOG_NULL;
  727.    }
  728.    else if( m_pLog->IsKindOf( RUNTIME_CLASS( COutputWindowLog ) ) )
  729.    {
  730.   dlg.m_iLogType = TCLOG_OUTPUTWINDOW;
  731.    }
  732.    else if( m_pLog->IsKindOf( RUNTIME_CLASS( CDebugLog ) ) )
  733.    {
  734.   dlg.m_iLogType = TCLOG_DEBUG;
  735.    }
  736.    else if( m_pLog->IsKindOf( RUNTIME_CLASS( CFileLog ) ) )
  737.    {
  738.   pFileLog = DYNAMIC_DOWNCAST( CFileLog, m_pLog );
  739.   dlg.m_iLogType = TCLOG_FILE;
  740.   dlg.m_strFileName = pFileLog->GetFileName();
  741.    }
  742.    iOldLogType = dlg.m_iLogType;
  743.    nResult = dlg.DoModal();
  744.    if( nResult != IDOK )
  745.    {
  746.   return;
  747.    }
  748.    switch( dlg.m_iLogType )
  749.    {
  750.    case TCLOG_NULL:
  751.   if( iOldLogType != TCLOG_NULL )
  752.   {
  753.  delete m_pLog;
  754.  m_pLog = new CNullLog;
  755.   }
  756.   break;
  757.    case TCLOG_OUTPUTWINDOW:
  758.   if( iOldLogType != TCLOG_OUTPUTWINDOW )
  759.   {
  760.  CMainFrame* pMainFrame;
  761.  delete m_pLog;
  762.  pMainFrame = STATIC_DOWNCAST( CMainFrame, AfxGetMainWnd() );
  763.  m_pLog = new COutputWindowLog( GetOutputEditControl() );
  764.   }
  765.   break;
  766.    case TCLOG_DEBUG:
  767.   if( iOldLogType != TCLOG_DEBUG )
  768.   {
  769.  delete m_pLog;
  770.  m_pLog = new CDebugLog;
  771.   }
  772.   break;
  773.    case TCLOG_FILE:
  774.   if( (iOldLogType != TCLOG_FILE) || ((iOldLogType == TCLOG_FILE) &&
  775.  ((DYNAMIC_DOWNCAST( CFileLog, m_pLog ))->GetFileName() !=
  776.  dlg.m_strFileName)) )
  777.   {
  778.  delete m_pLog;
  779.  m_pLog = new CFileLog;
  780.  pFileLog = DYNAMIC_DOWNCAST( CFileLog, m_pLog );
  781.  tSuccess = pFileLog->Create( dlg.m_strFileName );
  782.  if( !tSuccess )
  783.  {
  784. TRACE( "Failed to create log file.n" );
  785.  }
  786.   }
  787.   break;
  788.    }
  789. }
  790. void CTestContainer98Doc::OnContainerOptions()
  791. {
  792.    int nResult;
  793.    CFeaturesPage pageFeatures;
  794.    CInterfacesPage pageInterfaces;
  795.    CServicesPage pageServices;
  796.    CPropertySheet sheet( IDS_CONTAINEROPTIONS );
  797.    pageFeatures.m_tAllowWindowless = m_tAllowWindowless;
  798.    pageFeatures.m_tTwoPassDrawing = m_tTwoPassDrawing;
  799.    pageFeatures.m_tHonorIgnoreActivateWhenVisible =
  800.   m_tHonorIgnoreActivateWhenVisible;
  801.    pageFeatures.m_tUseIPointerInactive = m_tUseIPointerInactive;
  802.    pageFeatures.m_tUseQuickActivation = m_tUseQuickActivation;
  803.    sheet.AddPage( &pageFeatures );
  804.    pageInterfaces.m_tIOleInPlaceSiteEx = m_tIOleInPlaceSiteEx;
  805.    pageInterfaces.m_tIOleInPlaceSiteWindowless = m_tIOleInPlaceSiteWindowless;
  806.    pageInterfaces.m_tIAdviseSinkEx = m_tIAdviseSinkEx;
  807.    sheet.AddPage( &pageInterfaces );
  808.    pageServices.m_tSBindHost = m_tSBindHost;
  809.    sheet.AddPage( &pageServices );
  810.    sheet.m_psh.dwFlags &= ~PSH_HASHELP;
  811.    sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
  812.    nResult = sheet.DoModal();
  813.    if( nResult != IDOK )
  814.    {
  815.   return;
  816.    }
  817.    m_tAllowWindowless = pageFeatures.m_tAllowWindowless;
  818.    m_tTwoPassDrawing = pageFeatures.m_tTwoPassDrawing;
  819.    m_tHonorIgnoreActivateWhenVisible =
  820.   pageFeatures.m_tHonorIgnoreActivateWhenVisible;
  821.    m_tUseIPointerInactive = pageFeatures.m_tUseIPointerInactive;
  822.    m_tUseQuickActivation = pageFeatures.m_tUseQuickActivation;
  823.    m_tIOleInPlaceSiteEx = pageInterfaces.m_tIOleInPlaceSiteEx;
  824.    m_tIOleInPlaceSiteWindowless = pageInterfaces.m_tIOleInPlaceSiteWindowless;
  825.    m_tIAdviseSinkEx = pageInterfaces.m_tIAdviseSinkEx;
  826.    m_tSBindHost = pageServices.m_tSBindHost;
  827. }
  828. void CTestContainer98Doc::OnContainerAmbientProperties()
  829. {
  830.    DISPID dispidChanged;
  831.    BOOL tChanged;
  832.    CAmbientProperty* pProperty;
  833.    CAmbientPropertiesDlg dlg( NULL, this );
  834.    dlg.DoModal();
  835.    // Check for changes.
  836.    tChanged = dlg.GetChangedPropertyID( &dispidChanged );
  837.    if( tChanged )
  838.    {
  839.   if( (dispidChanged == DISPID_AMBIENT_USERMODE) || (dispidChanged ==
  840.  DISPID_UNKNOWN) )
  841.   {
  842.  // Update our cached version of the UserMode property.
  843.  pProperty = FindAmbientProperty( DISPID_AMBIENT_USERMODE );
  844.  ASSERT( pProperty != NULL );
  845.  ASSERT( pProperty->GetValue().vt == VT_BOOL );
  846.  m_tUserMode = pProperty->GetValue().bVal;
  847.   }
  848.   BroadcastAmbientPropertyChange( dispidChanged );
  849.    }
  850. }
  851. void CTestContainer98Doc::OnContainerInfo()
  852. {
  853.    CContainerInfoDlg dlg( NULL, this );
  854.    dlg.DoModal();
  855. }
  856. void CTestContainer98Doc::OnEditDeleteAll()
  857. {
  858.    CTestContainer98Item* pItem;
  859.    POSITION posItem;
  860.    POSITION posView;
  861.    CTestContainer98View* pView;
  862.    posView = GetFirstViewPosition();
  863.    ASSERT( posView != NULL );
  864.    pView = DYNAMIC_DOWNCAST( CTestContainer98View, GetNextView( posView ) );
  865.    pView->ClearSelection();
  866.    do
  867.    {
  868.   posItem = GetStartPosition();
  869.   if( posItem != NULL )
  870.   {
  871.  pItem = (CTestContainer98Item*)GetNextItem( posItem );
  872.  ASSERT( pItem != NULL );
  873.  pItem->Delete();
  874.   }
  875.    } while( posItem != NULL );
  876.    UpdateAllViews( NULL );
  877. }
  878. void CTestContainer98Doc::OnUpdateEditDeleteAll( CCmdUI* pCmdUI )
  879. {
  880.    POSITION posItem;
  881.    posItem = GetStartPosition();
  882.    pCmdUI->Enable( posItem != NULL );
  883. }
  884. void CTestContainer98Doc::RemoveItem( CDocItem* pItem )
  885. {
  886.    POSITION posItem;
  887.    posItem = m_lpTabOrder.Find( DYNAMIC_DOWNCAST( CTestContainer98Item,
  888.   pItem ) );
  889.    ASSERT( posItem != NULL );
  890.    m_lpTabOrder.RemoveAt( posItem );
  891. COleDocument::RemoveItem( pItem );
  892. }
  893. void CTestContainer98Doc::OnContainerTabOrder()
  894. {
  895.    POSITION posItem;
  896.    CTabOrderDlg dlg;
  897.    int nResult;
  898.    CTestContainer98Item* pItem;
  899.    posItem = m_lpTabOrder.GetHeadPosition();
  900.    while( posItem != NULL )
  901.    {
  902.   pItem = m_lpTabOrder.GetNext( posItem );
  903.   ASSERT( pItem != NULL );
  904.   dlg.m_lpTabOrder.AddTail( pItem );
  905.    }
  906.    nResult = dlg.DoModal();
  907.    if( nResult != IDOK )
  908.    {
  909.   return;
  910.    }
  911.    m_lpTabOrder.RemoveAll();
  912.    posItem = dlg.m_lpTabOrder.GetHeadPosition();
  913.    while( posItem != NULL )
  914.    {
  915.   pItem = dlg.m_lpTabOrder.GetNext( posItem );
  916.   m_lpTabOrder.AddTail( pItem );
  917.    }
  918. }
  919. CEdit* CTestContainer98Doc::GetOutputEditControl()
  920. {
  921.    POSITION posView;
  922.    CView* pView;
  923.    posView = GetFirstViewPosition();
  924.    ASSERT( posView != NULL );
  925.    while( posView != NULL )
  926.    {
  927.   pView = GetNextView( posView );
  928.   ASSERT( pView != NULL );
  929.   if( pView->IsKindOf( RUNTIME_CLASS( CEditView ) ) )
  930.   {
  931.  return( &(STATIC_DOWNCAST( CEditView, pView )->GetEditCtrl()) );
  932.   }
  933.    }
  934.    return( NULL );
  935. }
  936. CTestContainer98View* CTestContainer98Doc::GetView() const
  937. {
  938.    POSITION posView;
  939.    CView* pView;
  940.    posView = GetFirstViewPosition();
  941.    ASSERT( posView != NULL );
  942.    while( posView != NULL )
  943.    {
  944.   pView = GetNextView( posView );
  945.   ASSERT( pView != NULL );
  946.   if( pView->IsKindOf( RUNTIME_CLASS( CTestContainer98View ) ) )
  947.   {
  948.  return( STATIC_DOWNCAST( CTestContainer98View, pView ) );
  949.   }
  950.    }
  951.    ASSERT( FALSE );
  952.    return( NULL );
  953. }
  954. CTestContainer98Item* CTestContainer98Doc::AddControl( REFCLSID clsid,
  955.    LPCTSTR pszName, REFIID iidPersistanceMedium, IUnknown* pPersistanceMedium )
  956. {
  957.    CTestContainer98Item* pItem;
  958.    pItem = NULL;
  959.    try
  960.    {
  961.   pItem = new CTestContainer98Item( this );
  962.   ASSERT_VALID( pItem );
  963.   if( !pItem->CreateOrLoad( clsid, pszName, iidPersistanceMedium,
  964.  pPersistanceMedium ) )
  965.   {
  966.  AfxThrowOleException( E_FAIL );
  967.   }
  968.   ASSERT_VALID( pItem );
  969.   pItem->InvalidateItem();
  970.    }
  971.    catch( ... )
  972.    {
  973.   pItem->Delete();
  974.   throw;
  975.    }
  976.    ASSERT( pItem != NULL );
  977.    return( pItem );
  978. }
  979. LPDISPATCH CTestContainer98Doc::InsertControl( LPCTSTR pszProgID,
  980.    LPCTSTR pszName )
  981. {
  982.    USES_CONVERSION;
  983.    CLSID clsid;
  984.    HRESULT hResult;
  985.    CTestContainer98Item* pItem;
  986.    IDispatch* pDispatch;
  987.    CScriptManager* pScriptManager;
  988.    TRACE( "InsertControl: %sn", pszProgID );
  989.    hResult = CLSIDFromProgID( T2COLE( pszProgID ), &clsid );
  990.    if( FAILED( hResult ) )
  991.    {
  992.   TRACE( "CLSIDFromProgID failedn" );
  993.   return( NULL );
  994.    }
  995.    pItem = NULL;
  996.    try
  997.    {
  998.   pItem = AddControl( clsid, pszName );
  999.   ASSERT_VALID( pItem );
  1000.   pItem->InvalidateItem();
  1001.    }
  1002.    catch( COleException* pException )
  1003.    {
  1004.   ASSERT( pItem == NULL );
  1005.   hResult = pException->m_sc;
  1006.   pException->Delete();
  1007.   return( NULL );
  1008.    }
  1009.    catch( CException* pException )
  1010.    {
  1011.   ASSERT( pItem == NULL );
  1012.   pException->Delete();
  1013.   return( NULL );
  1014.    }
  1015.    ASSERT( pItem != NULL );
  1016.    pDispatch = NULL;
  1017.    hResult = pItem->m_lpObject->QueryInterface( IID_IDispatch,
  1018.   (void**)&pDispatch );
  1019.    if( FAILED( hResult ) )
  1020.    {
  1021.   pItem->Delete();
  1022.   return( NULL );
  1023.    }
  1024.    ASSERT( pDispatch != NULL );
  1025.    pScriptManager = GetScriptManager( FALSE );
  1026.    if( pScriptManager != NULL )
  1027.    {
  1028.   pScriptManager->AddNamedItem( pszName, pDispatch );
  1029.    }
  1030.    FireOnNewControl( pDispatch );
  1031.    return( pDispatch );
  1032. }
  1033. LPDISPATCH CTestContainer98Doc::GetPrimarySelection()
  1034. {
  1035.    IDispatch* pDispatch;
  1036.    POSITION posView;
  1037.    CTestContainer98View* pView;
  1038.    HRESULT hResult;
  1039.    posView = GetFirstViewPosition();
  1040.    ASSERT( posView != NULL );
  1041.    pView = (CTestContainer98View*)GetNextView( posView );
  1042.    ASSERT( posView == NULL );
  1043.    if( pView->m_pSelection == NULL )
  1044.    {
  1045.   return( NULL );
  1046.    }
  1047.    pDispatch = NULL;
  1048.    hResult = pView->m_pSelection->m_lpObject->QueryInterface( IID_IDispatch,
  1049.   (void**)&pDispatch );
  1050.    if( FAILED( hResult ) )
  1051.    {
  1052.   return( NULL );
  1053.    }
  1054.    return( pDispatch );
  1055. }
  1056. void CTestContainer98Doc::SetPrimarySelection( LPDISPATCH pNewSelection )
  1057. {
  1058.    IUnknownPtr punkItem;
  1059.    IUnknownPtr punkNewSelection;
  1060.    POSITION posItem;
  1061.    CTestContainer98Item* pItem;
  1062.    if( pNewSelection == NULL )
  1063.    {
  1064.   GetView()->ClearSelection();
  1065.    }
  1066.    else
  1067.    {
  1068.   punkNewSelection = pNewSelection;
  1069.   ASSERT( punkNewSelection != NULL );
  1070.   posItem = GetStartPosition();
  1071.   while( posItem != NULL )
  1072.   {
  1073.  pItem = (CTestContainer98Item*)GetNextItem( posItem );
  1074.  punkItem = pItem->m_lpObject;
  1075.  ASSERT( punkItem != NULL );
  1076.  if( punkItem == punkNewSelection )
  1077.  {
  1078. GetView()->SetSelection( pItem );
  1079. return;
  1080.  }
  1081.   }
  1082.    }
  1083. }
  1084. LPDISPATCH CTestContainer98Doc::FindControl( LPCTSTR pszName )
  1085. {
  1086.    POSITION posItem;
  1087.    CTestContainer98Item* pItem;
  1088.    IDispatch* pDispatch;
  1089.    HRESULT hResult;
  1090.    posItem = GetStartPosition();
  1091.    while( posItem != NULL )
  1092.    {
  1093.   pItem = (CTestContainer98Item*)GetNextItem( posItem );
  1094.   if( pItem->GetDisplayName() == pszName )
  1095.   {
  1096.  hResult = pItem->m_lpObject->QueryInterface( IID_IDispatch,
  1097. (void**)&pDispatch );
  1098.  if( FAILED( hResult ) )
  1099.  {
  1100. return( NULL );
  1101.  }
  1102.  return( pDispatch );
  1103.   }
  1104.    }
  1105. return( NULL );
  1106. }
  1107. void CTestContainer98Doc::OnToolsMacros()
  1108. {
  1109.    CMacroDlg dlg;
  1110.    int nResult;
  1111.    HRESULT hResult;
  1112.    CScriptManager* pScriptManager;
  1113.    pScriptManager = GetScriptManager();
  1114.    if( pScriptManager == NULL )
  1115.    {
  1116.   return;
  1117.    }
  1118.    dlg.m_pScriptManager = m_pScriptManager;
  1119.    nResult = dlg.DoModal();
  1120.    if( nResult != IDOK )
  1121.    {
  1122.   return;
  1123.    }
  1124.    hResult = dlg.m_pScript->RunMacro( dlg.m_strMacroName );
  1125.    if( FAILED( hResult ) )
  1126.    {
  1127.   TRACE( "Script failedn" );
  1128.   return;
  1129.    }
  1130. }
  1131. HRESULT CTestContainer98Doc::InitScriptManager()
  1132. {
  1133.    POSITION posItem;
  1134.    CTestContainer98Item* pItem;
  1135.    IDispatchPtr pDispatch;
  1136.    m_pScriptManager = new CScriptManager( this );
  1137.    if( m_pScriptManager == NULL )
  1138.    {
  1139.   return( E_OUTOFMEMORY );
  1140.    }
  1141.    posItem = GetStartPosition();
  1142.    while( posItem != NULL )
  1143.    {
  1144.   pItem = (CTestContainer98Item*)GetNextItem( posItem );
  1145.   pDispatch = pItem->m_lpObject;
  1146.   if( pDispatch == NULL )
  1147.   {
  1148.  return( E_NOINTERFACE );
  1149.   }
  1150.   m_pScriptManager->AddNamedItem( pItem->GetDisplayName(), pDispatch );
  1151.    }
  1152.    return( S_OK );
  1153. }
  1154. void CTestContainer98Doc::Log( LPCTSTR pszMessage )
  1155. {
  1156.    CLog* pLog;
  1157.    pLog = GetLog();
  1158.    (*pLog)<<pszMessage;
  1159. }
  1160. void CTestContainer98Doc::FireOnNewControl( IDispatch* pControl )
  1161. {
  1162.    int iSink;
  1163.    IDispatch* pSink;
  1164.    COleDispatchDriver driver;
  1165.    const CPtrArray* pConnections = m_xTC98CP.GetConnections();
  1166.    ASSERT( pConnections != NULL );
  1167.    for( iSink = 0; iSink < pConnections->GetSize(); iSink++ )
  1168.    {
  1169.   pSink = (IDispatch*)(pConnections->GetAt( iSink ));
  1170.   ASSERT( pSink != NULL );
  1171.   driver.AttachDispatch( pSink, FALSE );
  1172.   try
  1173.   {
  1174.  driver.InvokeHelper( 1, DISPATCH_METHOD, VT_EMPTY, NULL, LPBYTE(
  1175. VTS_DISPATCH ), pControl );
  1176.   }
  1177.   catch( CException* pException )
  1178.   {
  1179.  pException->Delete();
  1180.   }
  1181.    }
  1182. }
  1183. BOOL CTestContainer98Doc::GetDispatchIID( IID* piid )
  1184. {
  1185.    ASSERT( piid != NULL );
  1186.    *piid = __uuidof( ITestContainer98 );
  1187.    return( TRUE );
  1188. }
  1189. BOOL CTestContainer98Doc::OnOpenDocument( LPCTSTR pszPathName )
  1190. {
  1191.    int iChar;
  1192.    ASSERT( pszPathName != NULL );
  1193.    iChar = lstrlen( pszPathName )-1;
  1194.    while( (iChar >= 0) && (pszPathName[iChar] != _T( '\' )) )
  1195.    {
  1196.   iChar--;
  1197.    }
  1198.    m_strDirectory = CString( pszPathName ).Left( iChar+1 );
  1199. if( !COleDocument::OnOpenDocument( pszPathName ) )
  1200.    {
  1201. return( FALSE );
  1202.    }
  1203. return( TRUE );
  1204. }
  1205. CScriptManager* CTestContainer98Doc::GetScriptManager( BOOL tCreate )
  1206. {
  1207.    HRESULT hResult;
  1208.    if( m_pScriptManager == NULL )
  1209.    {
  1210.   if( tCreate )
  1211.   {
  1212.  hResult = InitScriptManager();
  1213.  if( FAILED( hResult ) )
  1214.  {
  1215. AfxMessageBox( IDS_NOSCRIPTING );
  1216.  }
  1217.  else
  1218.  {
  1219. ASSERT( m_pScriptManager != NULL );
  1220.  }
  1221.   }
  1222.    }
  1223.    return( m_pScriptManager );
  1224. }
  1225. void CTestContainer98Doc::OnRunMacro()
  1226. {
  1227.    CScript* pScript;
  1228.    CString strMacroName;
  1229.    CMainFrame* pMainFrame;
  1230.    CComboBox* pComboBox;
  1231.    HRESULT hResult;
  1232.    CScriptManager* pScriptManager;
  1233.    pScriptManager = GetScriptManager();
  1234.    if( pScriptManager == NULL )
  1235.    {
  1236.   return;
  1237.    }
  1238.    pMainFrame = STATIC_DOWNCAST( CMainFrame, AfxGetMainWnd() );
  1239.    pComboBox = STATIC_DOWNCAST( CComboBox,
  1240.   pMainFrame->m_wndMacroBar.GetDlgItem( IDC_MACRO ) );
  1241.    pComboBox->GetLBText( 0, strMacroName );
  1242.    TRACE( "Macro: %sn", LPCTSTR( strMacroName ) );
  1243.    pScript = pScriptManager->FindMacro( strMacroName );
  1244.    if( pScript != NULL )
  1245.    {
  1246.   hResult = pScript->RunMacro( strMacroName );
  1247.   if( FAILED( hResult ) )
  1248.   {
  1249.   }
  1250.    }
  1251. }