gecko-dev/cmd/macfe/central/CPlainTextConversionContext.cp

253 строки
7.5 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.
*/
// CPlainTextConversionContext.cp
// This might seem like a lot of work to go around the code in ns/lib/xlate/text.c,
// but doing this allows us not to have to put if (inContext == NULL) inside
// CNSContextCallbacks.cp; and by calling the TXFE_* functions from the overridden
// methods, we pickup any modifcations made for free.
//#include <yvals.h>
#include "CPlainTextConversionContext.h"
#include "xlate.h"
//_EXTERN_C
extern "C" {
// prototypes for text.c functions
extern void TXFE_DisplayTable(MWContext *cx, int iLoc, LO_TableStruct *table);
extern void TXFE_DisplayLineFeed(MWContext *cx, int iLocation, LO_LinefeedStruct *line_feed, XP_Bool notused);
extern void TXFE_DisplayHR(MWContext *cx, int iLocation , LO_HorizRuleStruct *HR);
extern char *TXFE_TranslateISOText(MWContext *cx, int charset, char *ISO_Text);
extern void TXFE_DisplayBullet(MWContext *cx, int iLocation, LO_BullettStruct *bullet);
extern void TXFE_FinishedLayout(MWContext *cx);
extern void TXFE_AllConnectionsComplete(MWContext *cx);
extern void TXFE_DisplaySubtext(MWContext *cx, int iLocation, LO_TextStruct *text,
int32 start_pos, int32 end_pos, XP_Bool notused);
extern void TXFE_DisplayText(MWContext *cx, int iLocation, LO_TextStruct *text, XP_Bool needbg);
extern void TXFE_DisplaySubDoc(MWContext *cx, int iLocation, LO_SubDocStruct *subdoc_struct);
extern int TXFE_GetTextInfo(MWContext *cx, LO_TextStruct *text, LO_TextInfo *text_info);
extern void TXFE_LayoutNewDocument(MWContext *cx, URL_Struct *url, int32 *w, int32 *h, int32* mw, int32* mh);
// These are here because the backend files are .c files, which are only
// run through the C compiler. Thus we need to create and destroy the
// CPlainTextConversionContext from a .cp file
MWContext* CreatePlainTextConversionContext(MWContext* inUIContext);
void DisposePlainTextConversionContext(MWContext* inContext);
} // extern "C"
#pragma mark --- CALLBACKS ---
MWContext* CreatePlainTextConversionContext(MWContext* inUIContext)
{
try {
CPlainTextConversionContext* theContext = new CPlainTextConversionContext(inUIContext);
// Very slimey, but somebody needs to have an interest in the context
theContext->AddUser(theContext);
return theContext->operator MWContext*();
} catch (...) {
return NULL;
}
}
void DisposePlainTextConversionContext(MWContext* inContext)
{
CPlainTextConversionContext* theContext =
dynamic_cast<CPlainTextConversionContext*>(ExtractNSContext(inContext));
Assert_(theContext != NULL);
// One of these days, this call might break
theContext->RemoveUser(theContext);
}
CPlainTextConversionContext::CPlainTextConversionContext(MWContext* inUIContext) :
CNSContext(MWContextText)
{
mUIContext = ExtractNSContext(inUIContext);
Assert_(mUIContext != NULL);
}
#pragma mark --- OVERRIDES ---
void CPlainTextConversionContext::LayoutNewDocument(
URL_Struct* inURL,
Int32* inWidth,
Int32* inHeight,
Int32* inMarginWidth,
Int32* inMarginHeight)
{
TXFE_LayoutNewDocument(*this, inURL, inWidth, inHeight, inMarginWidth, inMarginHeight);
}
void CPlainTextConversionContext::DisplaySubtext(
int inLocation,
LO_TextStruct* inText,
Int32 inStartPos,
Int32 inEndPos,
XP_Bool inNeedBG)
{
TXFE_DisplaySubtext(*this, inLocation, inText, inStartPos, inEndPos, inNeedBG);
}
void CPlainTextConversionContext::DisplayText(
int inLocation,
LO_TextStruct* inText,
XP_Bool inNeedBG)
{
TXFE_DisplayText(*this, inLocation, inText, inNeedBG);
}
void CPlainTextConversionContext::DisplaySubDoc(
int inLocation,
LO_SubDocStruct* inSubdocStruct)
{
TXFE_DisplaySubDoc(*this, inLocation, inSubdocStruct);
}
void CPlainTextConversionContext::DisplayTable(
int inLocation,
LO_TableStruct* inTableStruct)
{
TXFE_DisplayTable(*this, inLocation, inTableStruct);
}
void CPlainTextConversionContext::DisplayLineFeed(
int inLocation,
LO_LinefeedStruct* inLinefeedStruct,
XP_Bool inNeedBG)
{
TXFE_DisplayLineFeed(*this, inLocation, inLinefeedStruct, inNeedBG);
}
void CPlainTextConversionContext::DisplayHR(
int inLocation,
LO_HorizRuleStruct* inRuleStruct)
{
TXFE_DisplayHR(*this, inLocation, inRuleStruct);
}
char* CPlainTextConversionContext::TranslateISOText(
int inCharset,
char* inISOText)
{
return TXFE_TranslateISOText(*this, inCharset, inISOText);
}
void CPlainTextConversionContext::DisplayBullet(
int inLocation,
LO_BullettStruct* inBulletStruct)
{
TXFE_DisplayBullet(*this, inLocation, inBulletStruct);
}
void CPlainTextConversionContext::FinishedLayout(void)
{
TXFE_FinishedLayout(*this);
}
int CPlainTextConversionContext::GetTextInfo(
LO_TextStruct* inText,
LO_TextInfo* inTextInfo)
{
return TXFE_GetTextInfo(*this, inText, inTextInfo);
}
int CPlainTextConversionContext::MeasureText(
LO_TextStruct* /*inText*/,
short* /*outCharLocs*/)
{
return 0;
}
void CPlainTextConversionContext::AllConnectionsComplete(void)
{
if (mProgress)
{
mProgress->RemoveUser(this);
mProgress = NULL;
}
TXFE_AllConnectionsComplete(*this);
mUIContext->AllConnectionsComplete();
CNSContext::AllConnectionsComplete();
}
void CPlainTextConversionContext::GraphProgressInit(
URL_Struct* inURL,
Int32 inContentLength)
{
try {
Assert_(mUIContext != NULL);
if (mUIContext && mUIContext->GetContextProgress())
mProgress = mUIContext->GetContextProgress();
else
{
mProgress = new CContextProgress;
mUIContext->SetContextProgress(mProgress);
}
mProgress->AddUser(this);
} catch (...) {
mProgress = NULL;
}
mUIContext->GraphProgressInit(inURL, inContentLength);
}
void CPlainTextConversionContext::Progress(const char* inMessageText )
{
Assert_(mUIContext != NULL);
mUIContext->Progress(inMessageText);
}
void CPlainTextConversionContext::GraphProgressDestroy(
URL_Struct* inURL,
Int32 inContentLength,
Int32 inTotalRead)
{
Assert_(mUIContext != NULL);
mUIContext->GraphProgressDestroy(inURL, inContentLength, inTotalRead);
}
void CPlainTextConversionContext::GraphProgress(
URL_Struct* inURL,
Int32 inBytesReceived,
Int32 inBytesSinceLast,
Int32 inContentLength)
{
Assert_(mUIContext != NULL);
mUIContext->GraphProgress(inURL, inBytesReceived, inBytesSinceLast, inContentLength);
}
#pragma mark --- STUBS ---
// FIX ME? Do we really wan't to override these methods?
void CPlainTextConversionContext::Alert(const char* /* inAlertText */) {}
XP_Bool CPlainTextConversionContext::Confirm(const char* /* inMessage */) { return false; }
char* CPlainTextConversionContext::Prompt(
const char* /* inMessage */,
const char* /* inDefaultText */) { return NULL; }
XP_Bool CPlainTextConversionContext::PromptUsernameAndPassword(
const char* /* inMessage */,
char** /* outUserName */,
char** /* outPassword */) { return false; }
char* CPlainTextConversionContext::PromptPassword(const char* /* inMessage */) { return NULL; }