gecko-dev/cmd/winfe/fmhtml.cpp

293 строки
9.6 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "stdafx.h"
#include "fmhtml.h"
#include "odctrl.h"
#include "intl_csi.h"
#include "netsdoc.h"
#include "edview.h"
#include "edt.h"
#ifdef MOZ_ENDER_MIME
#include "mhtmlstm.h"
#endif
extern char * EDT_NEW_DOC_URL;
// This file is dedicated to form type select one elements
// otherwise known as list boxes on windows and
// their implementation as requried by the XP layout
// library.
// Construction simply clears all members.
CFormHtmlarea::CFormHtmlarea()
{
// No Widget yet.
m_pWidget = NULL;
}
// Destruction cleans out all members.
CFormHtmlarea::~CFormHtmlarea()
{
}
// How to set the LO form element.
// This may change during the lifetime of an instance, so use this
// to update all referencing values.
void CFormHtmlarea::SetElement(LO_FormElementStruct *pFormElement)
{
// Call the base.2
CFormElement::SetElement(pFormElement);
if (m_pWidget && m_pWidget->GetEditView())
m_pWidget->GetEditView()->SetElement(pFormElement);
else
return;
MWContext *t_context;
CNetscapeEditView *t_view = m_pWidget->GetEditView();
if (!t_view)
return;
t_context = t_view->GetContext()->GetContext();
if (t_context)
EDT_SetEmbeddedEditorData(t_context, pFormElement);
else
XP_ASSERT(FALSE);
}
// Set the owning context.1
// Use this to determine what context we live in and how we should
// represent ourself (DC or window).
void CFormHtmlarea::SetContext(CAbstractCX *pCX)
{
// Call the base.
CFormElement::SetContext(pCX);
}
// Display the form element given the particular context we are in.
// Possibly only use a DC for representation, or have the
// window move.
void CFormHtmlarea::DisplayFormElement(LTRB& Rect)
{
// Display only has meaning if our context is a device context.
if(GetContext() && GetContext()->IsDCContext()) {
// Further, need to detect how we're going to be drawing ourselves.
RECT rect;
rect.left=Rect.left;
rect.right=Rect.right;
rect.top=Rect.top;
rect.bottom=Rect.bottom;
MoveWindow(m_pWidget->m_hWnd, Rect.left, Rect.top + EDIT_SPACE / 2);
m_pWidget->ShowWindow(SW_SHOW);
m_pWidget->UpdateWindow();
if (m_pWidget->GetEditView())
{
m_pWidget->GetEditView()->ShowWindow(SW_SHOW);
m_pWidget->GetEditView()->UpdateWindow();
}
CWnd::FromHandle(VOID2CX(GetContext(), CPaneCX)->GetPane())->InvalidateRect(&rect);
}
// Call the base.
CFormElement::DisplayFormElement(Rect);
}
// Destroy the widget (window) implemenation of the form.
void CFormHtmlarea::DestroyWidget()
{
// Get rid of the widget if around.
if (m_pWidget)
{
m_pWidget->DestroyWindow();
m_pWidget=NULL;
}
}
// Create the widget (window) implementation of the form
// but DO NOT DISPLAY.3
void CFormHtmlarea::CreateWidget()
{
if(GetContext() && GetElement())
if(VOID2CX(GetContext(), CPaneCX)->GetPane())
{
m_pWidget = new CEnderView(GetContext());
if (!m_pWidget->Create(CWnd::FromHandle(VOID2CX(GetContext(), CPaneCX)->GetPane()),GetElementHtmlareaData(),GetTextAttr() ))
DestroyWidget();
MWContext *t_context;
t_context = m_pWidget->GetEditView()->GetContext()->GetContext();
if (t_context)
{
lo_FormElementTextareaData *t_data = (lo_FormElementTextareaData *)GetElementHtmlareaData();
EDT_SetEmbeddedEditorData(t_context, t_data);
}
else
XP_ASSERT(FALSE);
}
}
// Copy the current data out of the layout struct into the form
// widget, or mark that you should represent using the current data.
//use the mime bits if you dont have current_text!
void CFormHtmlarea::UseCurrentData()
{
// Detect context type and do the right thing.
if(GetContext()) {
// Need a widget.
if(m_pWidget && m_pWidget->GetEditView()) {
// Determine the default text to set.
char *pCurrent = "";
lo_FormElementTextareaData *t_data = (lo_FormElementTextareaData *)GetElementHtmlareaData();
if(t_data && t_data->current_text)
pCurrent = (char *)t_data->current_text;
if (*pCurrent)
#ifdef MOZ_ENDER_MIME
EDT_SetDefaultHTML( m_pWidget->GetEditView()->GetContext()->GetContext(), pCurrent );
#else
EDT_SetDefaultHTML( m_pWidget->GetEditView()->GetContext()->GetContext(), pCurrent );
#endif /*MOZ_ENDER_MIME*/
}
}
}
// Copy the default data out of the layout struct into the form 4
// widget, or mark that you should represent using the default data.
void CFormHtmlarea::UseDefaultData()
{
// Detect context type and do the right thing.
if(GetContext())
{
// Need a widget.
if(m_pWidget) {
// Determine the default text to set.
char *pDefault = "";
lo_FormElementTextareaData *t_data = (lo_FormElementTextareaData *)GetElementHtmlareaData();
if(t_data && t_data->default_text) {
pDefault = (char *)t_data->default_text;
}
if (pDefault)
#ifdef MOZ_ENDER_MIME
EDT_SetDefaultHTML( m_pWidget->GetEditView()->GetContext()->GetContext(), pDefault );
#else
EDT_SetDefaultHTML( m_pWidget->GetEditView()->GetContext()->GetContext(), pDefault );
#endif /*MOZ_ENDER_MIME*/
}
}
}
// Fill in the layout size information in the layout struct regarding
// the dimensions of the widget.6
void CFormHtmlarea::FillSizeInfo()
{
// Detect context type and do the right thing.
if(GetContext() && GetElement())
{
// Need a widget.
if(m_pWidget)
{
// Determine our window position.
CRect crRect;
m_pWidget->GetWindowRect(crRect);
// Munge the coordinate a little for layout.
// We'll have to know how to decode this information
// in the display routine (by half).
GetElement()->width = crRect.Width();
GetElement()->height = crRect.Height() + EDIT_SPACE;
GetElement()->border_vert_space = EDIT_SPACE/2;
}
else
{
// No widget, tell layout nothing.
GetElement()->width = 0;
GetElement()->height = 0;
GetElement()->baseline = 0;
}
}
}
// Copy the current data out of the form element back into the
// layout struct.
void CFormHtmlarea::UpdateCurrentData(BOOL bSubmit)
{
if(GetContext())
{
lo_FormElementTextareaData *t_data = (lo_FormElementTextareaData *)GetElementHtmlareaData();
if(m_pWidget && ::IsWindow(m_pWidget->GetSafeHwnd()) && t_data)
{
if(t_data->current_text) {
XP_FREE(t_data->current_text);
t_data->current_text = NULL;
}
#ifdef MOZ_ENDER_MIME
if (bSubmit)
{
MWContext *t_context;
t_context = m_pWidget->GetEditView()->GetContext()->GetContext();
XP_FREEIF(GetElementHtmlareaData()->mime_bits);/*this also nulls it*/
/*first save data the way it WAS!*/
char *t_oldbuffer = NULL;
EDT_SaveToBuffer(t_context,(char **)&t_oldbuffer);
char *pRootPartName = NULL;
lo_FormElementHtmlareaData *t_htmldata = (lo_FormElementHtmlareaData *)t_data;
//fs will be deleted in the UrlExitRoutine called from the ::Complete function.
MSG_MimeRelatedStreamSaver *fs = new MSG_MimeRelatedStreamSaver(NULL, t_context, NULL,
FALSE, MSG_DeliverNow,
NULL, 0,
NULL,
NULL,
&pRootPartName,(char **)&t_htmldata->mime_bits);
EDT_SaveFileTo(t_context,
ED_FINISHED_MAIL_SEND,
pRootPartName,fs, TRUE, TRUE);
// Spin here until temp file saving is finished
while( t_context->edit_saving_url )
{
FEU_StayingAlive();
}
if (t_oldbuffer)
{
EDT_SetDefaultHTML( t_context, t_oldbuffer );
XP_FREE(t_oldbuffer);
}
}
else
#endif //MOZ_ENDER_MIME
{
MWContext *t_context = m_pWidget->GetEditView()->GetContext()->GetContext();
EDT_SaveToBuffer(t_context,(char **)&t_data->current_text);
}
}
}
// Note: EDT_SaveFileTo will delete fs, even if it returns an error. So
// it is incorrect to delete it here. Also, we ignore the result, because
// it calls FE_Alert itself.
}
HWND CFormHtmlarea::GetRaw()
{
return(m_pWidget ? m_pWidget->m_hWnd : NULL);
}