Update of /cvsroot/wxdevcenter/wxDevCenter/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21767/src Modified Files: Tag: modularisation FileSystemStandard.cpp Module.cpp MainFrame.cpp Frame.cpp Application.cpp DocManager.cpp Plugin.cpp Log Message: Rename Plugin::Module(RefData) in Plugin::DynLib(RefData). Make all chages to compile with module support. Index: Module.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/Attic/Module.cpp,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** Module.cpp 21 Sep 2005 15:00:38 -0000 1.1.2.1 --- Module.cpp 22 Sep 2005 16:41:35 -0000 1.1.2.2 *************** *** 30,44 **** IMPLEMENT_CLASS(Module, wxObject) - ObjectManager<wxClassInfo> Module::s_ModuleClassInfoManager; ! Module::Module(wxClassInfo* pClassInfo): ! wxObject(), ! m_pClassInfo(pClassInfo) ! { ! s_ModuleClassInfoManager.Register(pClassInfo); ! } ! ! void Module::RegisterModules() { ! /** @todo Add register code.*/ } --- 30,37 ---- IMPLEMENT_CLASS(Module, wxObject) ! Module::Module(wxClassInfo* pClassInfo, ClassInfoManager* pBaseClassInfoManager): ! wxObject() { ! pBaseClassInfoManager->Register(pClassInfo); } Index: FileSystemStandard.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/FileSystemStandard.cpp,v retrieving revision 1.19 retrieving revision 1.19.2.1 diff -C2 -d -r1.19 -r1.19.2.1 *** FileSystemStandard.cpp 14 Sep 2005 20:17:00 -0000 1.19 --- FileSystemStandard.cpp 22 Sep 2005 16:41:35 -0000 1.19.2.1 *************** *** 36,41 **** ////////////////////////////////////////////////////////////////////// // Standard file system ! bool FileSystemStandardBase::CreateDirectory(FilePath strDir) { strDir.RemoveProtocol(); --- 36,43 ---- ////////////////////////////////////////////////////////////////////// // Standard file system + IMPLEMENT_ABSTRACT_CLASS(FileSystemStandard, FileSystem) + WXDC_IMPLEMENT_MODULE_BASE_CLASS(FileSystemStandard) ! bool FileSystemStandard::CreateDirectory(FilePath strDir) { strDir.RemoveProtocol(); *************** *** 43,47 **** } ! bool FileSystemStandardBase::RemoveDirectory(FilePath strDir) { strDir.RemoveProtocol(); --- 45,49 ---- } ! bool FileSystemStandard::RemoveDirectory(FilePath strDir) { strDir.RemoveProtocol(); *************** *** 49,53 **** } ! bool FileSystemStandardBase::RemoveFile(FilePath strFilePath) { strFilePath.RemoveProtocol(); --- 51,55 ---- } ! bool FileSystemStandard::RemoveFile(FilePath strFilePath) { strFilePath.RemoveProtocol(); *************** *** 55,59 **** } ! int FileSystemStandardBase::GetFileType(const FilePath& strPath) { long type; --- 57,61 ---- } ! int FileSystemStandard::GetFileType(const FilePath& strPath) { long type; *************** *** 73,77 **** } ! wxImageList* FileSystemStandardBase::GetImageList(int width) { wxImageList* pIL = new wxImageList(width, width, true, WXDC_STDFS_FILETYPES + Application::GetApp().GetDocManager().GetDocTemplateCount()); --- 75,79 ---- } ! wxImageList* FileSystemStandard::GetImageList(int width) { wxImageList* pIL = new wxImageList(width, width, true, WXDC_STDFS_FILETYPES + Application::GetApp().GetDocManager().GetDocTemplateCount()); *************** *** 96,105 **** } ! wxInputStream* FileSystemStandardBase::GetInputStream(FilePath strPath) { return new wxFileInputStream(GetPhysicalFilePath(strPath)); } ! wxOutputStream* FileSystemStandardBase::GetOutputStream(FilePath strPath) { return new wxFileOutputStream(GetPhysicalFilePath(strPath)); --- 98,107 ---- } ! wxInputStream* FileSystemStandard::GetInputStream(FilePath strPath) { return new wxFileInputStream(GetPhysicalFilePath(strPath)); } ! wxOutputStream* FileSystemStandard::GetOutputStream(FilePath strPath) { return new wxFileOutputStream(GetPhysicalFilePath(strPath)); Index: Plugin.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/Plugin.cpp,v retrieving revision 1.11 retrieving revision 1.11.2.1 diff -C2 -d -r1.11 -r1.11.2.1 *** Plugin.cpp 15 Sep 2005 16:11:47 -0000 1.11 --- Plugin.cpp 22 Sep 2005 16:41:35 -0000 1.11.2.1 *************** *** 37,41 **** */ ! ModuleRefData::ModuleRefData(): wxObjectRefData(), m_flagState(Initial), --- 37,41 ---- */ ! DynLibRefData::DynLibRefData(): wxObjectRefData(), m_flagState(Initial), *************** *** 45,49 **** } ! ModuleRefData::~ModuleRefData() { } --- 45,49 ---- } ! DynLibRefData::~DynLibRefData() { } *************** *** 51,55 **** // Débugage : Dump du contenu. wxDEBUG_CODE( ! wxString ModuleRefData::Dump() { wxString str; --- 51,55 ---- // Débugage : Dump du contenu. wxDEBUG_CODE( ! wxString DynLibRefData::Dump() { wxString str; *************** *** 63,67 **** // Charge le module. ! bool ModuleRefData::Load(wxString strLongName) { wxString strFileName; --- 63,67 ---- // Charge le module. ! bool DynLibRefData::Load(wxString strLongName) { wxString strFileName; *************** *** 82,86 **** m_strPath = strPath; ! wxLogDebug(wxT("Loading module %s"), m_strPath.GetData()); BaseElementManager* pOldBEM = Element::s_pElementManager; Element::s_pElementManager = &m_Elements; --- 82,86 ---- m_strPath = strPath; ! wxLogDebug(wxT("Loading dynlib %s"), m_strPath.GetData()); BaseElementManager* pOldBEM = Element::s_pElementManager; Element::s_pElementManager = &m_Elements; *************** *** 91,100 **** { m_flagState |= Loaded; ! wxLogDebug(wxT("Module %s loaded"), strLongName.GetData()); } else { m_flagState = Error; ! wxLogDebug(wxT("Module %s loading error"), strLongName.GetData()); } return flag; --- 91,100 ---- { m_flagState |= Loaded; ! wxLogDebug(wxT("Dynlib %s loaded"), strLongName.GetData()); } else { m_flagState = Error; ! wxLogDebug(wxT("Dynlib %s loading error"), strLongName.GetData()); } return flag; *************** *** 102,106 **** } m_flagState = Error; ! wxLogDebug(wxT("Module %s not found"), strLongName.GetData()); return false; --- 102,106 ---- } m_flagState = Error; ! wxLogDebug(wxT("Dynlib %s not found"), strLongName.GetData()); return false; *************** *** 108,112 **** // Décharge le module. ! bool ModuleRefData::Unload() { return false; --- 108,112 ---- // Décharge le module. ! bool DynLibRefData::Unload() { return false; *************** *** 114,120 **** // Initialise le contenu du module. ! bool ModuleRefData::Initialize() { ! wxLogDebug("ModuleRefData::Initialize : %d", m_Elements.GetCount()); bool bOK = true; for(long l=0; l<(long)m_Elements.GetCount(); l++) --- 114,120 ---- // Initialise le contenu du module. ! bool DynLibRefData::Initialize() { ! wxLogDebug("DynlibRefData::Initialize : %d", m_Elements.GetCount()); bool bOK = true; for(long l=0; l<(long)m_Elements.GetCount(); l++) *************** *** 132,136 **** // Finalise le contenu du module. ! bool ModuleRefData::Finalize() { /** @todo Finalize all dependant elements.*/ --- 132,136 ---- // Finalise le contenu du module. ! bool DynLibRefData::Finalize() { /** @todo Finalize all dependant elements.*/ *************** *** 141,151 **** /** ! * Implémentation de la classe wxDevCenter::plugins::Module. */ ! IMPLEMENT_CLASS(Module, wxObject) // Constructeur. ! Module::Module(): wxObject() { --- 141,151 ---- /** ! * Implémentation de la classe wxDevCenter::plugins::DynLib. */ ! IMPLEMENT_CLASS(DynLib, wxObject) // Constructeur. ! DynLib::DynLib(): wxObject() { *************** *** 154,172 **** // Débugage : Dump du contenu. wxDEBUG_CODE( ! wxString Module::Dump() { ! ModuleRefData* pModRef = GetModuleRef(); if(pModRef!=NULL) return pModRef->Dump(); else ! return wxT("Null module"); } ) // Teste si le module est chargé. ! bool Module::IsLoaded()const { ! if(GetModuleRef()!=NULL) ! return GetModuleRef()->IsLoaded(); else return false; --- 154,172 ---- // Débugage : Dump du contenu. wxDEBUG_CODE( ! wxString DynLib::Dump() { ! DynLibRefData* pModRef = GetDynLibRef(); if(pModRef!=NULL) return pModRef->Dump(); else ! return wxT("Null dynlib"); } ) // Teste si le module est chargé. ! bool DynLib::IsLoaded()const { ! if(GetDynLibRef()!=NULL) ! return GetDynLibRef()->IsLoaded(); else return false; *************** *** 174,181 **** // Teste si le module est initialisé. ! bool Module::IsInitialized()const { ! if(GetModuleRef()!=NULL) ! return GetModuleRef()->IsInitialized(); else return false; --- 174,181 ---- // Teste si le module est initialisé. ! bool DynLib::IsInitialized()const { ! if(GetDynLibRef()!=NULL) ! return GetDynLibRef()->IsInitialized(); else return false; *************** *** 184,195 **** // Charge le module et enregistre son contenu. ! bool Module::Load(wxString strPath) { AllocExclusive(); ! return GetModuleRef()->Load(strPath); } // Décharge le module. ! bool Module::Unload() { return false; --- 184,195 ---- // Charge le module et enregistre son contenu. ! bool DynLib::Load(wxString strPath) { AllocExclusive(); ! return GetDynLibRef()->Load(strPath); } // Décharge le module. ! bool DynLib::Unload() { return false; *************** *** 197,204 **** // Initialise le contenu du module. ! bool Module::Initialize() { ! if(GetModuleRef()!=NULL) ! return GetModuleRef()->Initialize(); else return false; --- 197,204 ---- // Initialise le contenu du module. ! bool DynLib::Initialize() { ! if(GetDynLibRef()!=NULL) ! return GetDynLibRef()->Initialize(); else return false; *************** *** 206,210 **** // Finalise le contenu du module. ! bool Module::Finalize() { return false; --- 206,210 ---- // Finalise le contenu du module. ! bool DynLib::Finalize() { return false; *************** *** 239,245 **** for(long l=0; l<(long)m_arrstrPlugins.GetCount(); l++) str << wxT(" - ") << m_arrstrPlugins[l] << wxT("\n"); ! str << wxT("Used modules : ") << m_arrstrModules.GetCount() << wxT("\n"); ! for(long l=0; l<(long)m_arrstrModules.GetCount(); l++) ! str << wxT(" - ") << m_arrstrModules[l] << wxT("\n"); } return str; --- 239,245 ---- for(long l=0; l<(long)m_arrstrPlugins.GetCount(); l++) str << wxT(" - ") << m_arrstrPlugins[l] << wxT("\n"); ! str << wxT("Used modules : ") << m_arrstrDynLibs.GetCount() << wxT("\n"); ! for(long l=0; l<(long)m_arrstrDynLibs.GetCount(); l++) ! str << wxT(" - ") << m_arrstrDynLibs[l] << wxT("\n"); } return str; *************** *** 282,286 **** m_strNotes = File.GetNotes(); m_strURL = File.GetURL(); ! File.FillModuleArray(m_arrstrModules); File.FillDependantPluginArray(m_arrstrPlugins); m_Status |= PreLoaded; --- 282,286 ---- m_strNotes = File.GetNotes(); m_strURL = File.GetURL(); ! File.FillDynLibArray(m_arrstrDynLibs); File.FillDependantPluginArray(m_arrstrPlugins); m_Status |= PreLoaded; *************** *** 306,311 **** // Préchargement des modules. ! for(l=0; l<m_arrstrModules.GetCount(); l++) ! bOk &= m_pLoader->LoadModule(strName + wxT("/") + m_arrstrModules[l])!=NULL; m_Status |= Loaded | (bOk?0:Partial); --- 306,311 ---- // Préchargement des modules. ! for(l=0; l<m_arrstrDynLibs.GetCount(); l++) ! bOk &= m_pLoader->LoadDynLib(strName + wxT("/") + m_arrstrDynLibs[l])!=NULL; m_Status |= Loaded | (bOk?0:Partial); *************** *** 482,486 **** m_FeatureMap(), m_PluginMap(), ! m_ModuleMap() { } --- 482,486 ---- m_FeatureMap(), m_PluginMap(), ! m_DynLibMap() { } *************** *** 589,595 **** } ! str << wxT("*** Modules : ") << m_ModuleMap.size() << wxT(" ***\n"); ! ModuleMap::iterator it3; ! for( it3 = m_ModuleMap.begin(); it3 != m_ModuleMap.end(); ++it3 ) { str << wxT(">> ") << it3->first << wxT("\n"); --- 589,595 ---- } ! str << wxT("*** DynLibs : ") << m_DynLibMap.size() << wxT(" ***\n"); ! DynLibMap::iterator it3; ! for( it3 = m_DynLibMap.begin(); it3 != m_DynLibMap.end(); ++it3 ) { str << wxT(">> ") << it3->first << wxT("\n"); *************** *** 603,611 **** // Charge un module à l'adresse spécifiée. ! Module* PluginLoader::LoadModule(wxString strPath) { wxLogDebug(wxT("Loading module %s"), strPath.GetData()); ! Module& module = m_ModuleMap[strPath]; if(module.IsLoaded()) return &module; --- 603,611 ---- // Charge un module à l'adresse spécifiée. ! DynLib* PluginLoader::LoadDynLib(wxString strPath) { wxLogDebug(wxT("Loading module %s"), strPath.GetData()); ! DynLib& module = m_DynLibMap[strPath]; if(module.IsLoaded()) return &module; *************** *** 669,677 **** // Initialise un module. ! bool PluginLoader::InitializeModule(wxString strName) { wxLogDebug(wxT("Initializing module %s"), strName.GetData()); ! Module& module = m_ModuleMap[strName]; if(module.IsInitialized()) return true; --- 669,677 ---- // Initialise un module. ! bool PluginLoader::InitializeDynLib(wxString strName) { wxLogDebug(wxT("Initializing module %s"), strName.GetData()); ! DynLib& module = m_DynLibMap[strName]; if(module.IsInitialized()) return true; *************** *** 699,705 **** wxLogDebug("Initialize module :"); ! ModuleMap::iterator it3; ! for( it3 = m_ModuleMap.begin(); it3 != m_ModuleMap.end(); ++it3 ) ! InitializeModule(it3->first); } --- 699,705 ---- wxLogDebug("Initialize module :"); ! DynLibMap::iterator it3; ! for( it3 = m_DynLibMap.begin(); it3 != m_DynLibMap.end(); ++it3 ) ! InitializeDynLib(it3->first); } *************** *** 864,868 **** m_arrstrPlugins.Add(pDep->GetPropVal(wxT("name"), wxT(""))); else if(pDep->GetName()==wxT("module")) // Import d'un module. ! m_arrstrModules.Add(pDep->GetPropVal(wxT("name"), wxT(""))); pDep = pDep->GetNext(); --- 864,868 ---- m_arrstrPlugins.Add(pDep->GetPropVal(wxT("name"), wxT(""))); else if(pDep->GetName()==wxT("module")) // Import d'un module. ! m_arrstrDynLibs.Add(pDep->GetPropVal(wxT("name"), wxT(""))); pDep = pDep->GetNext(); *************** *** 874,880 **** // Suppression des noms vides unsigned long l; ! for(l=0; l<m_arrstrModules.GetCount(); l++) ! if(m_arrstrModules[l].IsEmpty()) ! m_arrstrModules.RemoveAt(l--); for(l=0; l<m_arrstrPlugins.GetCount(); l++) if(m_arrstrPlugins[l].IsEmpty()) --- 874,880 ---- // Suppression des noms vides unsigned long l; ! for(l=0; l<m_arrstrDynLibs.GetCount(); l++) ! if(m_arrstrDynLibs[l].IsEmpty()) ! m_arrstrDynLibs.RemoveAt(l--); for(l=0; l<m_arrstrPlugins.GetCount(); l++) if(m_arrstrPlugins[l].IsEmpty()) *************** *** 893,901 **** // Remplit une liste des chemins relatifs des modules à charger. ! void PluginDescriptionFile::FillModuleArray(wxArrayString& array) { unsigned long l; ! for(l=0; l<m_arrstrModules.GetCount(); l++) ! array.Add(m_arrstrModules[l]); } --- 893,901 ---- // Remplit une liste des chemins relatifs des modules à charger. ! void PluginDescriptionFile::FillDynLibArray(wxArrayString& array) { unsigned long l; ! for(l=0; l<m_arrstrDynLibs.GetCount(); l++) ! array.Add(m_arrstrDynLibs[l]); } Index: Frame.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/Frame.cpp,v retrieving revision 1.12 retrieving revision 1.12.2.1 diff -C2 -d -r1.12 -r1.12.2.1 *** Frame.cpp 15 Sep 2005 10:15:05 -0000 1.12 --- Frame.cpp 22 Sep 2005 16:41:35 -0000 1.12.2.1 *************** *** 65,77 **** ////////////////////////////////////////////////////////////////////// ! IMPLEMENT_CLASS(TopFrame, wxFrame) BEGIN_EVENT_TABLE(wxDevCenter::TopFrame, wxFrame) END_EVENT_TABLE() ! TopFrame::TopFrame(const wxString& title, const wxPoint& pos, const wxSize& size, long style): ! wxFrame(NULL, -1, title, pos, size, style), m_pViewFrame(NULL) { } --- 65,84 ---- ////////////////////////////////////////////////////////////////////// ! IMPLEMENT_ABSTRACT_CLASS(TopFrame, wxFrame) BEGIN_EVENT_TABLE(wxDevCenter::TopFrame, wxFrame) END_EVENT_TABLE() ! WXDC_IMPLEMENT_MODULE_BASE_CLASS(TopFrame) ! ! TopFrame::TopFrame(): ! wxFrame(), m_pViewFrame(NULL) { + } + + bool TopFrame::Create(const wxString& title, const wxPoint& pos, const wxSize& size, long style) + { + return wxFrame::Create(NULL, -1, title, pos, size, style); } Index: DocManager.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/DocManager.cpp,v retrieving revision 1.13 retrieving revision 1.13.2.1 diff -C2 -d -r1.13 -r1.13.2.1 *** DocManager.cpp 14 Sep 2005 20:01:53 -0000 1.13 --- DocManager.cpp 22 Sep 2005 16:41:35 -0000 1.13.2.1 *************** *** 299,303 **** pView->OnCreate(); ! Application::GetApp().GetMainFrame().AddView(pView); pView->OnInitialUpdate(); --- 299,303 ---- pView->OnCreate(); ! Application::GetApp().GetTopFrame().AddView(pView); pView->OnInitialUpdate(); Index: MainFrame.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/MainFrame.cpp,v retrieving revision 1.22 retrieving revision 1.22.2.1 diff -C2 -d -r1.22 -r1.22.2.1 *** MainFrame.cpp 14 Sep 2005 20:01:53 -0000 1.22 --- MainFrame.cpp 22 Sep 2005 16:41:35 -0000 1.22.2.1 *************** *** 34,37 **** --- 34,39 ---- #include <wxDevCenter/Layout.h> #include <wxDevCenter/ArtProvider.h> + #include <wxDevCenter/Module.h> + #include <wx/dataobj.h> *************** *** 51,55 **** ! IMPLEMENT_CLASS(MainFrame, TopFrame) BEGIN_EVENT_TABLE(MainFrame, TopFrame) --- 53,57 ---- ! IMPLEMENT_DYNAMIC_CLASS(MainFrame, TopFrame) BEGIN_EVENT_TABLE(MainFrame, TopFrame) *************** *** 93,99 **** END_EVENT_TABLE() MainFrame::MainFrame(void): ! TopFrame(WXDC_NAME, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN), m_pLayoutManager(NULL), m_WorkBarArray(), --- 95,102 ---- END_EVENT_TABLE() + WXDC_DECLARE_MODULE_CLASS(MainFrame, TopFrame) MainFrame::MainFrame(void): ! TopFrame(), m_pLayoutManager(NULL), m_WorkBarArray(), *************** *** 102,105 **** --- 105,114 ---- m_pMenuItemWorkBar(NULL) { + } + + bool MainFrame::Create(const wxString& title, const wxPoint& pos, const wxSize& size, long style) + { + if(!TopFrame::Create(title, pos, size, style)) + return false; // Création de la fenetre cadre cliente. *************** *** 123,126 **** --- 132,137 ---- SetDropTarget(new MainFrameDropTarget); + + return true; } *************** *** 304,310 **** // Ajoute une vue ! void MainFrame::AddView(View *pView) { GetViewFrame()->AddView(pView); } --- 315,322 ---- // Ajoute une vue ! bool MainFrame::AddView(View *pView) { GetViewFrame()->AddView(pView); + return true; } Index: Application.cpp =================================================================== RCS file: /cvsroot/wxdevcenter/wxDevCenter/src/Application.cpp,v retrieving revision 1.37 retrieving revision 1.37.2.1 diff -C2 -d -r1.37 -r1.37.2.1 *** Application.cpp 15 Sep 2005 16:11:47 -0000 1.37 --- Application.cpp 22 Sep 2005 16:41:35 -0000 1.37.2.1 *************** *** 31,35 **** #include <wxDevCenter/FileSystemCtrl.h> #include <wxDevCenter/Frame.h> - #include <wxDevCenter/MainFrame.h> #include <wxDevCenter/DocView.h> #include <wxDevCenter/FileTools.h> --- 31,34 ---- *************** *** 98,102 **** // Initialise le gestionnaire de systèmes de fichiers ! m_pStandardFileSystem = new FileSystemStandard; FileSystemManager::GetManager().Register(m_pStandardFileSystem, true); --- 97,101 ---- // Initialise le gestionnaire de systèmes de fichiers ! m_pStandardFileSystem = FileSystemStandard::CreateDerivateClass(); FileSystemManager::GetManager().Register(m_pStandardFileSystem, true); *************** *** 105,119 **** // Crée la fenetre principale ! m_pMainFrame = new MainFrame(); ! SetTopWindow(m_pMainFrame); // Fixe le conteneur de vue par défaut du DocManager ! m_DocManager.m_pDefaultViewContainer = (wxWindow*) m_pMainFrame->GetViewFrame(); // Affiche la fenetre principale. ! m_pMainFrame->Show(true); // Enregistre la fenêtre principale dans le WorkBarManager ! WorkBarManager::GetManager().RegisterFrame(m_pMainFrame); // Lance l'application. --- 104,123 ---- // Crée la fenetre principale ! m_pTopFrame = TopFrame::CreateDerivateClass(); ! if(!m_pTopFrame->Create(WXDC_NAME, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE)) ! { ! wxLogError(wxT("Can not create top frame")); ! return false; ! } ! SetTopWindow(m_pTopFrame); // Fixe le conteneur de vue par défaut du DocManager ! m_DocManager.m_pDefaultViewContainer = (wxWindow*) m_pTopFrame->GetViewFrame(); // Affiche la fenetre principale. ! m_pTopFrame->Show(true); // Enregistre la fenêtre principale dans le WorkBarManager ! WorkBarManager::GetManager().RegisterFrame(m_pTopFrame); // Lance l'application. *************** *** 333,337 **** } ! m_pMainFrame->AddView(pView); pView->OnInitialUpdate(); --- 337,341 ---- } ! m_pTopFrame->AddView(pView); pView->OnInitialUpdate(); |