This commit was manufactured by cvs2svn to create branch 'captive'.
[reactos.git] / subsys / system / explorer / Seashell / SeaShellExt / UIHtmlView.cpp
diff --git a/subsys/system/explorer/Seashell/SeaShellExt/UIHtmlView.cpp b/subsys/system/explorer/Seashell/SeaShellExt/UIHtmlView.cpp
new file mode 100644 (file)
index 0000000..e9d4efc
--- /dev/null
@@ -0,0 +1,694 @@
+//*******************************************************************************
+// COPYRIGHT NOTES
+// ---------------
+// You may use this source code, compile or redistribute it as part of your application 
+// for free. You cannot redistribute it as a part of a software development 
+// library without the agreement of the author. If the sources are 
+// distributed along with the application, you should leave the original 
+// copyright notes in the source code without any changes.
+// This code can be used WITHOUT ANY WARRANTIES at your own risk.
+// 
+// For the latest updates to this code, check this site:
+// http://www.masmex.com 
+// after Sept 2000
+// 
+// Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
+//*******************************************************************************
+
+// HtmlMsgView.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "UIHtmlView.h"
+#include "UIMessages.h"
+#include <atlbase.h>
+#include <mshtml.h>
+#include "UIres.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CUIHtmlView
+
+IMPLEMENT_DYNAMIC(CUIHtmlView, CHtmlView)
+
+CUIHtmlView::CUIHtmlView()
+{
+       //{{AFX_DATA_INIT(CUIHtmlView)
+               // NOTE: the ClassWizard will add member initialization here
+       //}}AFX_DATA_INIT
+       m_pHTMLDocument2 = NULL;
+       m_hNotifyWnd = NULL;
+       m_bSetCursor = false;
+}
+
+CUIHtmlView::~CUIHtmlView()
+{
+       ReleaseDocument();
+}
+
+BOOL CUIHtmlView::PreCreateWindow(CREATESTRUCT& cs) 
+{
+       // TODO: Add your specialized code here and/or call the base class
+       cs.lpszClass = AfxRegisterWndClass(
+                                 CS_DBLCLKS,                       
+                                 NULL,                             
+                                 NULL,                             
+                                 NULL); 
+       ASSERT(cs.lpszClass);
+       BOOL bRet = CHtmlView::PreCreateWindow(cs);
+       cs.dwExStyle |= WS_EX_CLIENTEDGE;
+//     cs.style |= WS_BORDER;
+       return bRet;    
+}
+
+void CUIHtmlView::ReleaseDocument()
+{
+       if (m_pHTMLDocument2)
+       {
+               m_pHTMLDocument2->Release();
+               m_pHTMLDocument2 = NULL;
+       }
+}
+
+void CUIHtmlView::DocumentReady()
+{
+       m_bSetCursor = false;
+}
+
+bool CUIHtmlView::ExecScript(LPCTSTR pszScript,LPCTSTR pszLang,_variant_t *pvt)
+{
+       bool bRet = false;
+       CWaitCursor w;
+       IHTMLWindow2 *pW2=NULL;
+       IHTMLDocument2 *pDoc = GetHTMLDocument();
+       if (pDoc == NULL)
+               return bRet;
+       HRESULT hr = pDoc->get_parentWindow(&pW2);
+       if (SUCCEEDED(hr))
+       {
+               if (pszLang == NULL)
+                       pszLang = _T("JScript");
+               _variant_t v;
+               hr = pW2->execScript(_bstr_t(pszScript),_bstr_t(pszLang),&v);
+               if (pvt)
+                       *pvt = v;
+               pW2->Release();
+               bRet= true;
+       }
+       return bRet;
+}
+
+CString CUIHtmlView::GetBodyText()
+{
+       IHTMLElement *pElem=NULL;
+       GetHTMLDocument()->get_body(&pElem);
+       _bstr_t bstText;
+       BSTR bsText;
+       pElem->get_innerText(&bsText);
+       pElem->Release();
+       bstText = bsText;
+       return (LPCTSTR)bstText;
+}
+
+CString CUIHtmlView::GetElementValue(LPCTSTR pszElemID)
+{
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       BSTR bsText;
+       _bstr_t bstText;
+       if (pElem)
+       {
+               IHTMLInputTextElement *pInputElem=NULL;
+               HRESULT hr = pElem->QueryInterface(IID_IHTMLInputTextElement,(LPVOID*)&pInputElem);
+               if (SUCCEEDED(hr))
+               {
+                       pInputElem->get_value(&bsText);
+                       bstText= bsText;
+                       pInputElem->Release();
+                       pInputElem = NULL;
+               }
+               pElem->Release();
+       }
+       return (LPCTSTR)bstText;
+}
+
+CString CUIHtmlView::GetElementText(LPCTSTR pszElemID)
+{
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       if (pElem == NULL)
+               return _T("");
+       BSTR bsText;
+       _bstr_t bstText;
+       pElem->get_innerText(&bsText);
+       bstText = bsText;
+       pElem->Release();
+       pElem = NULL;
+       return (LPCTSTR)bstText;
+}
+
+CString CUIHtmlView::GetElementHTML(LPCTSTR pszElemID)
+{
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       BSTR bsText;
+       _bstr_t bstText;
+       if (pElem)
+       {
+               pElem->get_innerHTML(&bsText);
+               bstText = bsText;
+               pElem->Release();
+               pElem = NULL;
+       }
+       return (LPCTSTR)bstText;
+}
+
+bool CUIHtmlView::SetElementValue(LPCTSTR pszElemID,LPCTSTR pszText)
+{
+       bool bRet=false;
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       if (pElem)
+       {
+               IHTMLInputTextElement *pInputElem=NULL;
+               HRESULT hr = pElem->QueryInterface(IID_IHTMLInputTextElement,(LPVOID*)&pInputElem);
+               if (SUCCEEDED(hr))
+               {
+                       pInputElem->put_value(_bstr_t(pszText));
+                       pInputElem->Release();
+                       pInputElem = NULL;
+                       bRet = true;
+               }
+               pElem->Release();
+               pElem = NULL;
+       }
+       return bRet;
+}
+
+bool CUIHtmlView::SetElementText(LPCTSTR pszElemID,LPCTSTR pszText)
+{
+       bool bRet=false;
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       if (pElem == NULL)
+               return bRet;
+       pElem->put_innerText(_bstr_t(pszText));
+       pElem->Release();
+       pElem = NULL;
+       bRet= true;
+       return bRet;
+}
+
+bool CUIHtmlView::SetElementHTML(LPCTSTR pszElemID,LPCTSTR pszText)
+{
+       bool bRet=false;
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       if (pElem == NULL)
+               return bRet;
+       pElem->put_innerHTML(_bstr_t(pszText));
+       pElem->Release();
+       pElem = NULL;
+       bRet= true;
+       return bRet;
+}
+
+bool CUIHtmlView::SetImageSource(LPCTSTR pszElemID,LPCTSTR pszText)
+{
+       bool bRet=false;
+       IHTMLElement *pElem=NULL;
+       GetElement(pszElemID,&pElem);
+       if (pElem == NULL)
+               return bRet;
+       IHTMLImgElement *pImgElem=NULL;
+       HRESULT hr = pElem->QueryInterface(IID_IHTMLImgElement,(LPVOID*)&pImgElem);
+       pElem->Release();
+       if (SUCCEEDED(hr))
+       {
+               pImgElem->put_src(_bstr_t(pszText));
+               pImgElem->Release();
+               bRet = true;
+       }
+       return bRet;
+}
+
+bool CUIHtmlView::GetOptionString(LPCTSTR pszElemID,CString &sText,CString &sValue)
+{
+       IHTMLElement *pElement = NULL;
+       GetElement(pszElemID,&pElement);
+       bool bRet=false;
+       if (pElement == NULL)
+               return bRet;
+       IHTMLSelectElement *pSelElem=NULL;
+       HRESULT hr = pElement->QueryInterface(IID_IHTMLSelectElement,(LPVOID*)&pSelElem);
+       pElement->Release();
+       pElement = NULL;
+       if (FAILED(hr))
+               return bRet;
+       long nSelIndex=-1;
+       pSelElem->get_selectedIndex(&nSelIndex);
+       if (nSelIndex == -1)
+       {
+               pSelElem->Release();
+               return bRet;
+       }
+       IDispatch *pDisp=NULL;
+       _variant_t vtName(nSelIndex);
+       _variant_t vtIndex;
+       pSelElem->item(vtName,vtIndex,&pDisp);
+       IHTMLOptionElement *pOptElem=NULL;
+       hr = pDisp->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pOptElem);
+       if (SUCCEEDED(hr))
+       {
+               _bstr_t bstValue;
+               BSTR bsValue;
+               pOptElem->get_value(&bsValue);
+               bstValue = bsValue;
+               sValue = (LPCTSTR)bstValue;
+               BSTR bsText;
+               _bstr_t bstText;
+               pOptElem->get_text(&bsText);
+               bstText = bsText;
+               sText = (LPCTSTR)bstText;
+               pOptElem->Release();
+               bRet=true;
+       }
+       if (pSelElem)
+               pSelElem->Release();
+       return bRet;
+}
+
+bool CUIHtmlView::SetOptionString(LPCTSTR pszElemID,LPCTSTR pszText)
+{
+       IHTMLElement *pElement = NULL;
+       GetElement(pszElemID,&pElement);
+       bool bRet=false;
+       if (pElement == NULL)
+               return bRet;
+       IHTMLSelectElement *pSelElem=NULL;
+       IDispatch *pDisp=NULL;
+       HRESULT hr = pElement->QueryInterface(IID_IHTMLSelectElement,(LPVOID*)&pSelElem);
+       if (FAILED(hr))
+               goto SOS_CleanUp;
+       {
+               long nLength=0;
+               pSelElem->get_length(&nLength);
+               for(long i=0;i < nLength;i++)
+               {
+                       _variant_t vtName(i);
+                       _variant_t vtIndex;
+                       pSelElem->item(vtName,vtIndex,&pDisp);
+                       if (pDisp == NULL)
+                               continue;
+                       IHTMLOptionElement *pOptElem=NULL;
+                       hr = pDisp->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pOptElem);
+                       pDisp->Release();
+                       pDisp = NULL;
+                       if (SUCCEEDED(hr))
+                       {
+                               _bstr_t bstValue;
+                               _bstr_t bstText;
+                               BSTR bsValue;
+                               BSTR bsText;
+                               pOptElem->get_value(&bsValue);
+                               pOptElem->get_text(&bsText);
+                               bstValue = bsValue;
+                               bstText = bsText;
+                               pOptElem->Release();
+                               if (_tcsicmp((LPCTSTR)bstText,pszText) == 0)
+                               {
+                                       pSelElem->put_selectedIndex(i);
+                                       bRet=true;
+                                       break;
+                               }
+                       }
+               }
+       }
+SOS_CleanUp:
+       if (pElement)
+               pElement->Release();
+       if (pSelElem)
+               pSelElem->Release();
+       return bRet;
+}
+
+bool CUIHtmlView::AddOptionString(LPCTSTR pszElemID,LPCTSTR pszText,LPCTSTR pszValue,bool bSelect)
+{
+       IHTMLElement *pElement = NULL;
+       GetElement(pszElemID,&pElement);
+       bool bRet=false;
+       if (pElement == NULL)
+               return bRet;
+       IHTMLSelectElement *pSelElem=NULL;
+       HRESULT hr = pElement->QueryInterface(IID_IHTMLSelectElement,(LPVOID*)&pSelElem);
+       pElement->Release();
+       if (FAILED(hr))
+               return bRet;
+       IHTMLElement *pNewElem=NULL;
+       GetHTMLDocument()->createElement(_bstr_t(_T("OPTION")),&pNewElem);
+       IHTMLOptionElement *pNewOptElem=NULL;
+       hr = E_FAIL;
+       if (pNewElem)
+               hr = pNewElem->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pNewOptElem);
+       if (SUCCEEDED(hr))
+       {
+               if (pszValue)
+               {
+                       _bstr_t bsValue(pszValue);
+                       pNewOptElem->put_value(bsValue);
+               }
+               _bstr_t bsText(pszText);
+               pNewOptElem->put_text(bsText);
+               pSelElem->add(pNewElem,_variant_t(vtMissing));
+               pNewOptElem->Release();
+               if (bSelect)
+               {
+                       long nLength=0;
+                       pSelElem->get_length(&nLength);
+                       if (nLength > 0)
+                               pSelElem->put_selectedIndex(nLength-1);
+               }
+               bRet=true;
+       }
+       if (pSelElem)
+               pSelElem->Release();
+       return bRet;
+}
+
+void CUIHtmlView::GetElement(LPCTSTR pszID,IHTMLElement **pElement)
+{
+       *pElement=NULL;
+       if (m_pHTMLDocument2 == NULL)
+               return;
+       CComQIPtr<IHTMLElementCollection> spAllElements;        
+       m_pHTMLDocument2->get_all(&spAllElements);
+       if (spAllElements)
+       {
+               IDispatch *pDisp=NULL;
+               HRESULT hr = spAllElements->item(CComVariant(pszID),CComVariant(0),&pDisp);
+               if (SUCCEEDED(hr))
+               {
+                       hr = pDisp->QueryInterface(IID_IHTMLElement,(LPVOID*)pElement);
+               }
+               pDisp->Release();
+       }
+}
+
+void CUIHtmlView::ParseDocument()  
+{
+       if(m_pHTMLDocument2 == NULL)
+               return;
+       try
+       {
+               CComQIPtr<IHTMLDocument2> spDocument(m_pHTMLDocument2);
+               CComQIPtr<IHTMLElementCollection> spAllElements;        
+               spDocument->get_all(&spAllElements);
+               CComBSTR bsIsControl(_T("OBJECT"));
+               CComBSTR bsIsImage(_T("IMG"));
+               long nElems;
+               spAllElements->get_length(&nElems);
+               for(long i = 0; i < nElems; i++)
+               {
+                       CComVariant vIndex(i, VT_I4);
+                       LPDISPATCH pDisp=NULL;
+                       spAllElements->item(vIndex,vIndex,&pDisp);
+                       CComQIPtr<IHTMLElement> spAnElement(pDisp);
+                       pDisp->Release();
+                       CComBSTR bsTagName;
+                       spAnElement->get_tagName(&bsTagName);
+                       if(bsTagName == bsIsControl)
+                       {
+                               // This will get you any ActiveX controls in a page.  It is possible 
+                               // to call methods and properties of the  control off the IHTMLElementPtr.
+                               CComQIPtr<IHTMLObjectElement> spObj(spAnElement);
+                               ActiveXControl(spObj);
+                       }
+                       else if(bsTagName == bsIsImage)
+                       {
+                               CComQIPtr<IHTMLImgElement> spImg(spAnElement);
+                               ImageElement(spImg);
+                       }
+                       else
+                               Element(spAnElement);
+               }
+       }
+       catch(...)
+       {
+#ifdef _DEBUG
+               AfxMessageBox(_T("Unspecified exception thrown in UIHtmlView"),MB_ICONSTOP);
+#endif 
+               throw;
+       }
+}
+
+void CUIHtmlView::ActiveXControl(IHTMLObjectElement *pObj)
+{
+}
+
+void CUIHtmlView::ImageElement(IHTMLImgElement *pImg)
+{
+}
+
+void CUIHtmlView::Element(IHTMLElement *pElement)
+{
+}
+
+void CUIHtmlView::DoDataExchange(CDataExchange* pDX)
+{
+       CHtmlView::DoDataExchange(pDX);
+       //{{AFX_DATA_MAP(CUIHtmlView)
+               // NOTE: the ClassWizard will add DDX and DDV calls here
+       //}}AFX_DATA_MAP
+}
+
+
+BEGIN_MESSAGE_MAP(CUIHtmlView, CHtmlView)
+       //{{AFX_MSG_MAP(CUIHtmlView)
+       ON_WM_SETCURSOR()
+       ON_COMMAND(ID_BROWSER_GO_BACK, OnBrowserGoBack)
+       ON_COMMAND(ID_BROWSER_GO_FORWARD, OnBrowserGoForward)
+       ON_COMMAND(ID_BROWSER_GO_BACK, OnBrowserGoBack)
+       ON_UPDATE_COMMAND_UI(ID_BROWSER_GO_FORWARD, OnUpdateBrowserGoForward)
+       ON_UPDATE_COMMAND_UI(ID_BROWSER_GO_BACK, OnUpdateBrowserGoBack)
+       ON_COMMAND(ID_BROWSER_GO_HOME, OnBrowserGoHome)
+       ON_COMMAND(ID_BROWSER_REFRESH, OnBrowserRefresh)
+       ON_COMMAND(ID_BROWSER_STOP, OnBrowserStop)
+       //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CUIHtmlView diagnostics
+
+#ifdef _DEBUG
+void CUIHtmlView::AssertValid() const
+{
+       CHtmlView::AssertValid();
+}
+
+void CUIHtmlView::Dump(CDumpContext& dc) const
+{
+       CHtmlView::Dump(dc);
+}
+#endif //_DEBUG
+
+/////////////////////////////////////////////////////////////////////////////
+// CUIHtmlView message handlers
+
+void CUIHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
+{
+       // TODO: Add your specialized code here and/or call the base class
+       
+   HRESULT   hr;
+   LPUNKNOWN lpUnknown;
+   LPUNKNOWN lpUnknownWB = NULL;
+   LPUNKNOWN lpUnknownDC = NULL;
+
+   lpUnknown = m_wndBrowser.GetControlUnknown();
+   ASSERT(lpUnknown);
+
+   if (lpUnknown)
+   {
+      // Get the IUnknown of the WebBrowser control being hosted.
+      // The IUnknown returned from GetControlUnknown is not the 
+      // IUnknown of the WebBrowser control.  It's actually a
+      // IOleObject pointer.
+      // 
+      hr = lpUnknown->QueryInterface(IID_IUnknown, 
+                             (LPVOID*)&lpUnknownWB);
+
+      ASSERT(SUCCEEDED(hr));
+
+      if (FAILED(hr))
+         return;
+
+      // Get the IUnknown of the object that fired this event.
+      //
+      hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC);
+
+
+      ASSERT(SUCCEEDED(hr));
+
+      if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
+      {
+         // The document has finished loading.
+         //
+                 LPDISPATCH pDispatch = GetHtmlDocument();
+                 if (pDispatch)
+                 {
+                               hr = pDispatch->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&m_pHTMLDocument2);
+                               DocumentReady();
+                               pDispatch->Release();
+                 }
+      }
+      if (lpUnknownWB)
+         lpUnknownWB->Release();
+
+      if (lpUnknownDC)
+         lpUnknownDC->Release();
+   }
+}
+
+void CUIHtmlView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel) 
+{
+       // TODO: Add your specialized code here and/or call the base class      ReleaseDocument();
+       m_bSetCursor = true;
+#ifdef _DEBUG
+       if (GetKeyState(VK_LCONTROL) < 0)
+       {
+               if (baPostedData.GetSize() > 0)
+               {
+                       LPTSTR pszData = new TCHAR[baPostedData.GetSize()+1];
+                       LPTSTR pszPosted = pszData;
+                       for(int i=0;i < baPostedData.GetSize();i++)
+                       {
+                               *pszPosted = baPostedData[i];
+                               pszPosted =_tcsinc(pszPosted);
+                       }
+                       *pszPosted = '\0';
+                       CString sMess;
+                       sMess = _T("Posted Data: ");
+                       sMess += pszData;
+                       sMess += _T("\n");
+                       sMess += _T("URL: ");
+                       sMess += lpszURL;
+                       AfxMessageBox(sMess);
+                       delete pszData;
+               }
+       }
+#endif
+       ReleaseDocument();
+       if (m_hNotifyWnd)
+       {
+               ::SendMessage(m_hNotifyWnd,WM_APP_CB_IE_SET_EDIT_TEXT,(WPARAM)lpszURL,0);       
+       }
+       CHtmlView::OnBeforeNavigate2(lpszURL, nFlags,   lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
+}
+
+BOOL CUIHtmlView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
+{
+       // TODO: Add your message handler code here and/or call default
+       if (m_bSetCursor)
+       {
+               SetCursor(::LoadCursor(NULL,IDC_APPSTARTING));
+               return TRUE;
+       }
+       
+       return CHtmlView::OnSetCursor(pWnd, nHitTest, message);
+}
+
+void CUIHtmlView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
+{
+       // TODO: Add your specialized code here and/or call the base class
+       
+}
+
+void CUIHtmlView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
+{
+       // TODO: Add your specialized code here and/or call the base class      
+       CHtmlView::OnActivateView(bActivate, pActivateView, pDeactiveView);
+       if (bActivate && pDeactiveView != NULL) 
+       {
+               OnTitleChange(GetLocationURL());
+               SetActiveWindow();
+       }
+}
+
+void CUIHtmlView::OnCommandStateChange(long nCommand, BOOL bEnable) 
+{
+       // TODO: Add your specialized code here and/or call the base class
+       switch(nCommand) 
+       {
+       case CSC_NAVIGATEFORWARD: 
+                  m_bGoForward = bEnable;
+           break;
+       case CSC_NAVIGATEBACK:
+           m_bGoBack = bEnable;
+           break;       
+          default:
+           break;
+       }  
+       
+       CHtmlView::OnCommandStateChange(nCommand, bEnable);
+}
+
+void CUIHtmlView::OnUpdateBrowserGoBack(CCmdUI *pUI)
+{
+       pUI->Enable(m_bGoBack);
+}
+
+void CUIHtmlView::OnUpdateBrowserGoForward(CCmdUI *pUI)
+{
+       pUI->Enable(m_bGoForward);
+}
+
+void CUIHtmlView::OnBrowserGoBack() 
+{
+       // TODO: Add your command handler code here
+       GoBack();
+}
+
+void CUIHtmlView::OnBrowserGoForward() 
+{
+       // TODO: Add your command handler code here
+       GoForward();    
+}
+
+void CUIHtmlView::OnBrowserGoHome() 
+{
+       // TODO: Add your command handler code here
+       GoHome();       
+}
+
+void CUIHtmlView::OnBrowserRefresh() 
+{
+       // TODO: Add your command handler code here
+       Refresh();      
+}
+
+void CUIHtmlView::OnBrowserStop() 
+{
+       // TODO: Add your command handler code here
+       Stop(); 
+}
+
+void CUIHtmlView::OnDocumentComplete(LPCTSTR lpszUrl)
+{
+       // make sure the main frame has the new URL.  This call also stops the animation
+       if (m_hNotifyWnd)
+       {
+               ::SendMessage(m_hNotifyWnd,WM_APP_CB_IE_SET_EDIT_TEXT,(WPARAM)lpszUrl,0);       
+       }
+       CHtmlView::OnDocumentComplete(lpszUrl);
+}
+
+void CUIHtmlView::OnTitleChange(LPCTSTR lpszText)
+{
+       // this will change the main frame's title bar
+       if (m_pDocument != NULL)
+               m_pDocument->SetTitle(lpszText);
+}