mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 08:12:05 +00:00
213 lines
5.9 KiB
C++
213 lines
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;
|
|
}
|
|
|