gecko-dev/cmd/winfe/enderwrp.cpp

213 строки
5.9 KiB
C++

#include "stdafx.h"
#include "enderwrp.h"
#include "edview.h"
#include "edt.h"
#include "netsdoc.h"
#include "compstd.h"
#include "compfrm.h"
IMPLEMENT_DYNCREATE(CEnderView, CView)
BEGIN_MESSAGE_MAP(CEnderView, CView)
//{{AFX_MSG_MAP(CEnderView)
ON_WM_DESTROY()
ON_MESSAGE(WM_TOOLCONTROLLER,OnToolController)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CEnderView::CEnderView(CAbstractCX *p_pCx)
:m_pEditView(NULL),m_pToolBarController(NULL),m_pCX(p_pCx)
{
}
CEnderView::~CEnderView()
{
if (m_pEditView)
{
m_pEditView->DestroyWindow();
}
#if 0
if (m_pToolbar)
m_pToolbar->DestroyWindow();
#endif //0
}
void CEnderView::OnDestroy()
{
if (m_pEditView)
{
CNetscapeDoc* pDoc = (CNetscapeDoc *)m_pEditView->GetDocument();
//warning! do not allow the CWinCX to RE-FREE its frame.
//we are borrowning the frame from the "browser window or layer"
//call ClearFrame to "Clear the frame"
CWinCX *pCX = m_pEditView->GetContext();
if (pCX)
{
pCX->ClearFrame();//NOT WORKING, MUST FIX
EDT_DestroyEditBuffer(pCX->GetContext());
}
m_pEditView->DestroyWindow();
if (pDoc)
delete pDoc;
m_pEditView=NULL;
}
}
void CEnderView::OnDraw(CDC *pDC)
{
return;
}
#ifdef MOZ_ENDER_MIME
BOOL
CEnderView::Create(CWnd *pParent, lo_FormElementHtmlareaData *pData, LO_TextAttr *pTextAttr)
#else
BOOL
CEnderView::Create(CWnd *pParent, lo_FormElementTextareaData *pData, LO_TextAttr *pTextAttr)
#endif //MOZ_ENDER_MIME
{
if (!CView::Create(NULL, NULL, WS_CHILD | WS_BORDER | WS_TABSTOP,CRect(0,0,1,1),pParent,ID_ENDER+1,NULL))
return FALSE;
if (m_pEditView)
{
assert(FALSE);
return FALSE;
}
lo_FormElementTextareaData *t_pData = (lo_FormElementTextareaData *)pData;
if(m_pCX)
{
if(m_pCX->IsWindowContext() && VOID2CX(m_pCX, CPaneCX)->GetPane())
{
// Need a widget representation.
//create a new CPaneCX
CNetscapeDoc* pDoc = new CNetscapeDoc();
m_pEditView = new CNetscapeEditView();
m_pEditView->SetEmbedded(TRUE);
RECT rect;
rect.left=0;
rect.top=0;
rect.right=1;
rect.bottom=1;
if (!m_pEditView->Create(NULL, NULL,
WS_CHILD | WS_VSCROLL | ES_LEFT | WS_TABSTOP | ES_MULTILINE //AFX_WS_DEFAULT_VIEW
, rect,
this, ID_ENDER, NULL))
{
TRACE("Warning: could not create view for frame.\n");
m_pEditView=NULL;
return FALSE;
}
CPaneCX* cx= VOID2CX(m_pCX, CPaneCX);
HWND hwnd= cx->GetPane();
CWnd *pwnd= CWnd::FromHandle(hwnd);
CGenericView *genview=NULL;
if (pwnd->IsKindOf(RUNTIME_CLASS(CGenericView)))
genview=(CGenericView *)pwnd;
if (!genview)
return FALSE;
CWinCX* pDontCare = new CWinCX((CGenericDoc *)pDoc,
genview->GetFrame(), (CGenericView *)m_pEditView);
pDontCare->GetContext()->is_editor = TRUE;
m_pEditView->SetContext(pDontCare);
pDontCare->Initialize(pDontCare->CDCCX::IsOwnDC(), &rect);
pDontCare->NormalGetUrl(EDT_NEW_DOC_URL);
//ADJUST THE SIZE OF THE WINDOW ACCORDING TO ROWS AND COLS EVEN THOUGH THAT IS NOT ACCURATE
// Measure some text.
CDC *pDC = m_pEditView->GetDC();
CyaFont *pMyFont;
if(pDC)
{
CDC t_dc;
t_dc.CreateCompatibleDC( pDC );
CDCCX *pDCCX = VOID2CX(m_pCX, CDCCX);
pDCCX->SelectNetscapeFont( t_dc.GetSafeHdc(), pTextAttr, pMyFont );
if (pMyFont)
{
//SetWidgetFont(pDC->GetSafeHdc(), m_pEditView->m_hWnd);
//GetElement()->text_attr->FE_Data = pMyFont;
// Default length is 20
// Default lines is 1
int32 lLength = 20;
int32 lLines = 1;
// See if we can measure the default text, and/or
// set up the size and size limits.
if(t_pData)
{
if(t_pData->cols > 0) {
// Use provided size.
lLength = t_pData->cols;
}
if(t_pData->rows > 0) {
// Use provided size.
lLines = t_pData->rows;
}
}
// Now figure up the width and height we would like.
// int32 lWidgetWidth = (lLength + 1) * tm.tmAveCharWidth + sysInfo.m_iScrollWidth;
// int32 lWidgetHeight = (lLines + 1) * tm.tmHeight;
int32 lWidgetWidth = (lLength + 1) * pMyFont->GetMeanWidth() + sysInfo.m_iScrollWidth;
int32 lWidgetHeight = (lLines + 1) * pMyFont->GetHeight();
// If no word wrapping, account a horizontal scrollbar.
if(t_pData->auto_wrap == TEXTAREA_WRAP_OFF) {
lWidgetHeight += sysInfo.m_iScrollHeight;
}
// Move the window.
m_pEditView->MoveWindow(0, 32, CASTINT(lWidgetWidth)-5, CASTINT(lWidgetHeight)-4, FALSE);
MoveWindow(1, 1, CASTINT(lWidgetWidth), CASTINT(lWidgetHeight+32), FALSE);
// Create the HTML edit toolbars. There are currently two separate
// toolbars.. one for formats and another for character operations.
m_pToolBarController = new CEditToolBarController(this);
if (!m_pToolBarController || !m_pToolBarController->CreateEditBars(m_pCX->GetContext(), m_pEditView, DISPLAY_CHARACTER_TOOLBAR))
{
TRACE("Bad ComposeBar");
if (m_pToolBarController)
delete m_pToolBarController;
m_pToolBarController = NULL;
return FALSE;
}
CComboToolBar *t_combobar=m_pToolBarController->GetCharacterBar();
t_combobar->MoveWindow(0,0,CASTINT(lWidgetWidth),32,FALSE);
t_combobar->ShowWindow(SW_SHOW);
pDCCX->ReleaseNetscapeFont( t_dc.GetSafeHdc(), pMyFont );
pDCCX->ReleaseContextDC(t_dc.GetSafeHdc());
m_pEditView->ReleaseDC(pDC);
}
else
{
m_pEditView->ReleaseDC(pDC);
return FALSE;
}
}
else
{
return FALSE;
}
}
else if(m_pCX->IsPureDCContext())
{
// Need a drawn representation.
}
}
return TRUE;
}
LONG
CEnderView::OnToolController(UINT,LONG)
{
return (LONG)m_pToolBarController;
}