зеркало из https://github.com/mozilla/pjs.git
1447 строки
42 KiB
C++
Executable File
1447 строки
42 KiB
C++
Executable File
/* -*- 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 "mainfrm.h"
|
||
#include "libi18n.h"
|
||
#include "xplocale.h"
|
||
#include "cxprint.h"
|
||
#include "cxsave.h"
|
||
|
||
#include "np.h"
|
||
#include "prlog.h"
|
||
#include "prlink.h"
|
||
#include "xpstrsw.h"
|
||
|
||
#if defined(OJI)
|
||
#include "jvmmgr.h"
|
||
#elif defined(JAVA)
|
||
#include "java.h"
|
||
#endif
|
||
|
||
#include "cuvfs.h"
|
||
#include "intl_csi.h"
|
||
#include "edt.h"
|
||
|
||
#include "prefapi.h"
|
||
#include "edt.h"
|
||
|
||
#ifdef XP_WIN32
|
||
static BOOL intlUnicodeFlag(int16 wincsid);
|
||
#define INIT_FLAG_FOR_CSID(c) { CIntlWin::flagTable[(c) & MASK_FLAG_TABLE] = intlUnicodeFlag(c);}
|
||
BOOL CIntlWin::flagTable[MAX_FLAG_TABLE_NUM];
|
||
#endif // XP_WIN32
|
||
|
||
|
||
extern int INTL_DocCharSetID(MWContext *context);
|
||
|
||
enum { // just to ignore unnecessary strcomp
|
||
javaFontHelvetica = 0,
|
||
javaFontTimesRoman,
|
||
javaFontCourier,
|
||
javaFontDialog,
|
||
javaFontDialogInput,
|
||
javaFontZapfDingbats
|
||
};
|
||
|
||
extern "C" {
|
||
const char* IntlGetJavaFaceName(int csid, int javaFontID);
|
||
BYTE IntlGetJavaCharset(int csid, int javaFontID);
|
||
jref *intl_makeJavaString(int16 encoding, char *str, int len);
|
||
|
||
};
|
||
|
||
extern "C" {
|
||
PR_PUBLIC_API(BOOL ) CINTLWIN_TEXTOUT_E(int16 wincsid, HDC hdc, int nXStart, int nYStart, LPCSTR lpString,int iLength);
|
||
PR_PUBLIC_API(BOOL ) CINTLWIN_GETTEXTEXTENTPOINT_E(int wincsid, HDC hDC, LPCSTR lpString, int cbString, LPSIZE lpSize);
|
||
|
||
PR_PUBLIC_API(const char*) INTLGETJAVAFACENAME_E(int csid, int javaFontID);
|
||
PR_PUBLIC_API(BYTE ) INTLGETJAVACHARSET_E(int csid, int javaFontID);
|
||
|
||
#ifdef JAVA
|
||
PR_PUBLIC_API(jref* ) INTL_MAKEJAVASTRING_E(int16 encoding, char *str, int len);
|
||
#endif // JAVA
|
||
|
||
PR_PUBLIC_API(int16* ) INTL_GETUNICODECSIDLIST_E(int16 * outnum);
|
||
PR_PUBLIC_API(int32 ) INTL_UNICODELEN_E(uint16* ustr);
|
||
PR_PUBLIC_API(INTL_CompoundStr* ) INTL_COMPOUNDSTRFROMUNICODE_E(uint16* inunicode, uint32 inlen);
|
||
PR_PUBLIC_API(void ) INTL_COMPOUNDSTRDESTROY_E(INTL_CompoundStr* This);
|
||
PR_PUBLIC_API(INTL_CompoundStrIterator ) INTL_COMPOUNDSTRFIRSTSTR_E(INTL_CompoundStr* This, INTL_Encoding_ID *outencoding, unsigned char** outtext);
|
||
PR_PUBLIC_API(INTL_CompoundStrIterator ) INTL_COMPOUNDSTRNEXTSTR_E(INTL_CompoundStrIterator iterator, INTL_Encoding_ID *outencoding, unsigned char** outtext);
|
||
PR_PUBLIC_API(INTL_CompoundStr* ) INTL_COMPOUNDSTRCLONE_E(INTL_CompoundStr* s1);
|
||
PR_PUBLIC_API(int16 ) INTL_DEFAULTWINCHARSETID_E(MWContext *context);
|
||
PR_PUBLIC_API(int32 ) INTL_TEXTBYTECOUNTTOCHARLEN_E(int16 csid, unsigned char* text, uint32 byteCount);
|
||
PR_PUBLIC_API(int32 ) INTL_TEXTCHARLENTOBYTECOUNT_E(int16 csid, unsigned char* text, uint32 charLen);
|
||
PR_PUBLIC_API(uint32 ) INTL_UNICODETOSTRLEN_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr, uint32 ustrlen);
|
||
PR_PUBLIC_API(void ) INTL_UNICODETOSTR_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr,uint32 ustrlen,unsigned char* dest, uint32 destbuflen);
|
||
};
|
||
|
||
//
|
||
// Data type use for Unicode table loader
|
||
//
|
||
#define MAXUTABLENAME 16
|
||
typedef struct tblrsrcinfo {
|
||
char name[MAXUTABLENAME];
|
||
uint16 refcount;
|
||
HGLOBAL hTbl;
|
||
} tblrsrcinfo;
|
||
|
||
typedef struct utablename {
|
||
uint16 csid;
|
||
tblrsrcinfo frominfo;
|
||
tblrsrcinfo toinfo;
|
||
|
||
} utablename;
|
||
//
|
||
// The following are private
|
||
//
|
||
static void intl_WriteUnicodeConvList(int num_of_csid, int16* csidlist);
|
||
static void intl_ReadUnicodeConvList();
|
||
static void intl_UnloadUCS2Table(uint16 csid, void *utblPtr, int from);
|
||
static tblrsrcinfo* intl_FindUTableName(uint16 csid, int from);
|
||
static void *intl_LoadUCS2Table(uint16 csid, int from);
|
||
static void intl_UnloadUCS2Table(uint16 csid, void *utblPtr, int from);
|
||
|
||
|
||
// This structure is used for following table for default font value,
|
||
// It'll be removed after default value goes to resource file.
|
||
struct FontCharTable
|
||
{
|
||
int16 csid;
|
||
char szPropFont[LF_FACESIZE] ;
|
||
int iPropSize ;
|
||
char szFixFont[LF_FACESIZE] ;
|
||
int iFixSize ;
|
||
int iPropCharset;
|
||
int iFixCharset;
|
||
};
|
||
|
||
// Note: always add new comer to last line.
|
||
struct FontCharTable fontchar_tbl[] =
|
||
{
|
||
CS_LATIN1, DEF_PROPORTIONAL_FONT, 12, DEF_FIXED_FONT, 10, ANSI_CHARSET, ANSI_CHARSET,
|
||
CS_SJIS, "<EFBFBD>l<EFBFBD>r <20><><EFBFBD><EFBFBD>", 10, "<EFBFBD>l<EFBFBD>r <20><><EFBFBD><EFBFBD>", 10, SHIFTJIS_CHARSET, SHIFTJIS_CHARSET,
|
||
CS_BIG5, "Times New Roman", 12, "Courier New", 10, CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET,
|
||
CS_KSC_8BIT,"Times New Roman", 12, "Courier New", 10, HANGEUL_CHARSET, HANGEUL_CHARSET,
|
||
CS_GB_8BIT, "Times New Roman", 12, "Courier New", 10, 134, 134,
|
||
CS_CP_1250, "Times New Roman", 12, "Courier New", 10, 238,238,
|
||
CS_CP_1251, "Times New Roman", 12, "Courier New", 10, 204,204,
|
||
CS_ARMSCII8, "ArmNet Helvetica", 12, "ArmNet Courier", 10, 160, 160,
|
||
CS_CP_1253, "Times New Roman", 12, "Courier New", 10, 161,161,
|
||
CS_8859_9, "Times New Roman", 12, "Courier New", 10, 162,162,
|
||
CS_VIET_VIQR, "Times New Roman", 12, "Courier New", 10, 163,163,
|
||
CS_VIET_VISCII, "<EFBFBD>nhMinh 1.1", 12, "MinhQu<EFBFBD>n 1.1", 10, 163,163,
|
||
CS_VIET_VPS, "VPS Times", 12, "VPS Courier", 10, 163,163,
|
||
CS_VIET_TCVN, ".VNTime", 12, ".VNTime", 10, 163,163,
|
||
CS_VIET_VNI, "VNI-Times", 12, "VNI-Times", 10, 163,163,
|
||
CS_TIS620, "AngsanaUPC", 16, "CordiaUPC", 14, THAI_CHARSET, THAI_CHARSET,
|
||
CS_UTF8, DEF_PROPORTIONAL_FONT, 12, DEF_FIXED_FONT, 10, DEFAULT_CHARSET, DEFAULT_CHARSET,
|
||
CS_USER_DEFINED_ENCODING, DEF_PROPORTIONAL_FONT, 12, DEF_FIXED_FONT, 10, ANSI_CHARSET, ANSI_CHARSET,
|
||
0, "", 0, "", 0, 0, 0
|
||
} ;
|
||
|
||
// This table defined how many encoding we supports in our Navigator and
|
||
// what kind of conversion we support for each encoding.
|
||
// Note: always add new comer to last line.
|
||
// Encoding, Encoding used for Display, supported CSID list, 0
|
||
|
||
unsigned int lang_table[] =
|
||
{
|
||
IDS_LANGUAGE_LATIN1, CS_LATIN1, CS_LATIN1, 0,
|
||
IDS_LANGUAGE_LATIN2, CS_CP_1250, CS_CP_1250, CS_LATIN2, 0,
|
||
IDS_LANGUAGE_JAPANESE, CS_SJIS, CS_AUTO | CS_SJIS, CS_SJIS, CS_JIS, CS_EUCJP, 0,
|
||
IDS_LANGUAGE_TAIWANESE, CS_BIG5, CS_BIG5, CS_CNS_8BIT,
|
||
CS_X_BIG5, 0,
|
||
IDS_LANGUAGE_CHINESE, CS_GB_8BIT, CS_GB_8BIT,
|
||
CS_GB2312, CS_GB2312_11, CS_HZ, 0,
|
||
IDS_LANGUAGE_KOREAN, CS_KSC_8BIT, CS_KSC_8BIT | CS_AUTO, CS_KSC_8BIT, CS_2022_KR,
|
||
CS_KSC5601, 0,
|
||
IDS_LANGUAGE_WIN1251, CS_CP_1251, CS_CP_1251, CS_8859_5, CS_KOI8_R, 0,
|
||
IDS_LANGUAGE_ARMENIAN, CS_ARMSCII8, CS_ARMSCII8, 0,
|
||
IDS_LANGUAGE_GREEK, CS_CP_1253, CS_CP_1253, CS_8859_7, 0,
|
||
IDS_LANGUAGE_TURKISH, CS_8859_9, CS_8859_9, 0,
|
||
IDS_LANGUAGE_VIETNAMESE_VIQR, CS_VIET_VIQR, CS_VIET_VIQR, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_TCVN, CS_VIET_VNI, 0,
|
||
IDS_LANGUAGE_VIETNAMESE_VISCII, CS_VIET_VISCII, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_TCVN, CS_VIET_VIQR, CS_VIET_VNI, 0,
|
||
IDS_LANGUAGE_VIETNAMESE_VPS, CS_VIET_VPS, CS_VIET_VPS, CS_VIET_VISCII, CS_VIET_TCVN, CS_VIET_VIQR, CS_VIET_VNI, 0,
|
||
IDS_LANGUAGE_VIETNAMESE_TCVN, CS_VIET_TCVN, CS_VIET_TCVN, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_VIQR, CS_VIET_VNI, 0,
|
||
IDS_LANGUAGE_VIETNAMESE_VNI, CS_VIET_VNI, CS_VIET_TCVN, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_VIQR, CS_VIET_VNI, 0,
|
||
IDS_LANGUAGE_THAI, CS_TIS620, CS_TIS620, 0,
|
||
IDS_LANGUAGE_UTF8, CS_UTF8, CS_UTF8, CS_UTF7, CS_UCS2, CS_UCS2_SWAP, 0,
|
||
IDS_LANGUAGE_USERDEFINED, CS_USER_DEFINED_ENCODING, CS_USER_DEFINED_ENCODING, 0,
|
||
UINT_MAX
|
||
};
|
||
|
||
CIntlFont::CIntlFont()
|
||
{
|
||
CString fontList;
|
||
LPSTR lpszPropName = NULL;
|
||
LPSTR lpszFixName = NULL;
|
||
int32 iPropSize, iFixSize ;
|
||
int iPropCharset, iFixCharset;
|
||
BOOL ret = FALSE;
|
||
int i ;
|
||
int nLang ;
|
||
EncodingInfo *pEncoding;
|
||
|
||
iPropCharset = iFixCharset = 0;
|
||
|
||
#ifdef XP_WIN32
|
||
for(int j = 0; j < MAX_FLAG_TABLE_NUM; j++)
|
||
INIT_FLAG_FOR_CSID(j);
|
||
#endif
|
||
|
||
pEncodingInfoTbl = (struct EncodingInfo *) malloc( (MAXLANGNUM + 1) * sizeof (struct EncodingInfo) ) ;
|
||
|
||
if (pEncodingInfoTbl == NULL)
|
||
{
|
||
TRACE("No memory for MultiLingual support.\n");
|
||
return ;
|
||
}
|
||
|
||
|
||
memset(pEncodingInfoTbl, 0, (MAXLANGNUM + 1) * sizeof(struct EncodingInfo));
|
||
|
||
nLang = 0;
|
||
pEncoding = pEncodingInfoTbl;
|
||
for (i = 0; (lang_table[i] != UINT_MAX) && (nLang < MAXLANGNUM); i++)
|
||
{
|
||
pEncoding->iLangResId = lang_table[i++];
|
||
pEncoding->iCSID = lang_table[i++];
|
||
|
||
// Setup default font information.
|
||
for (int j = 0; j < MAXLANGNUM; j++)
|
||
{
|
||
if (fontchar_tbl[j].csid == pEncoding->iCSID)
|
||
{
|
||
// First, lets try to copy from the hard coded table
|
||
strcpy(pEncoding->szPropName, fontchar_tbl[j].szPropFont);
|
||
pEncoding->iPropSize = fontchar_tbl[j].iPropSize;
|
||
strcpy(pEncoding->szFixName, fontchar_tbl[j].szFixFont);
|
||
pEncoding->iFixSize = fontchar_tbl[j].iFixSize;
|
||
pEncoding->iPropCharset = fontchar_tbl[j].iPropCharset;
|
||
pEncoding->iFixCharset = fontchar_tbl[j].iFixCharset;
|
||
}
|
||
}
|
||
|
||
char key[80];
|
||
// Now, let's try to get it from the PREF
|
||
sprintf(key, "intl.font%d.win.prop_font", pEncoding->iCSID);
|
||
lpszPropName = NULL;
|
||
if( PREF_NOERROR == PREF_CopyCharPref(key, &lpszPropName))
|
||
{
|
||
strcpy(pEncoding->szPropName, lpszPropName);
|
||
XP_FREE(lpszPropName);
|
||
}
|
||
sprintf(key, "intl.font%d.win.fixed_font", pEncoding->iCSID);
|
||
lpszFixName = NULL;
|
||
if( PREF_NOERROR == PREF_CopyCharPref(key, &lpszFixName))
|
||
{
|
||
strcpy(pEncoding->szFixName, lpszFixName);
|
||
XP_FREE(lpszFixName);
|
||
}
|
||
|
||
sprintf(key, "intl.font%d.win.prop_size", pEncoding->iCSID);
|
||
if( PREF_NOERROR == PREF_GetIntPref(key, &iPropSize))
|
||
pEncoding->iPropSize = (int)iPropSize;
|
||
|
||
sprintf(key, "intl.font%d.win.fixed_size", pEncoding->iCSID);
|
||
if( PREF_NOERROR == PREF_GetIntPref(key, &iFixSize))
|
||
pEncoding->iFixSize = (int)iFixSize;
|
||
|
||
// Setup supported CSID list
|
||
for (j =0; lang_table[i]; j++)
|
||
{
|
||
pEncoding->csid[j] = lang_table[i++] ;
|
||
#ifdef XP_WIN32
|
||
INIT_FLAG_FOR_CSID(pEncoding->csid[j]);
|
||
#endif
|
||
}
|
||
|
||
pEncoding->nCodeset = j;
|
||
|
||
nLang ++ ;
|
||
pEncoding ++ ;
|
||
|
||
}
|
||
|
||
nEncoding = MAXLANGNUM;
|
||
intl_ReadUnicodeConvList();
|
||
}
|
||
|
||
EncodingInfo * CIntlFont::GetEncodingInfo(int id)
|
||
{
|
||
|
||
if (id < nEncoding)
|
||
return &pEncodingInfoTbl[id];
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
EncodingInfo * CIntlFont::GetEncodingInfo(MWContext *pContext)
|
||
{
|
||
int doc_csid, id;
|
||
doc_csid = INTL_DocCharSetID(pContext) & ~CS_AUTO ;
|
||
id = DocCSIDtoID(doc_csid);
|
||
|
||
return GetEncodingInfo(id);
|
||
}
|
||
|
||
int16 IntlCharsetToCsid(BYTE charset)
|
||
{
|
||
int i;
|
||
|
||
for (i = 0; i < MAXLANGNUM; i++)
|
||
{
|
||
EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(i);
|
||
if (charset == pEncoding->iPropCharset)
|
||
return (pEncoding->iCSID & ~CS_AUTO);
|
||
}
|
||
return CS_LATIN1;
|
||
}
|
||
|
||
int CIntlFont::DocCSIDtoID(int doc_csid)
|
||
{
|
||
int i, j;
|
||
EncodingInfo *pEncoding ;
|
||
|
||
/**************************************************************/
|
||
/*** This section should work for everybody, but for now we ***/
|
||
/*** make it work for vietnamese only (our area). Basically ***/
|
||
/*** instead of returning the first csid found in doc_csid, ***/
|
||
/*** we check the default view encoding first, and return ***/
|
||
/*** that default view csid if found, otherwise it will ***/
|
||
/*** return the value as the usual way ***/
|
||
int k;
|
||
int16 def_doccsid;
|
||
def_doccsid = INTL_DefaultDocCharSetID(0);
|
||
if (! ((def_doccsid == CS_VIET_VISCII) ||
|
||
(def_doccsid == CS_VIET_VPS) ||
|
||
(def_doccsid == CS_VIET_TCVN) ||
|
||
(def_doccsid == CS_VIET_VNI) ||
|
||
(def_doccsid == CS_VIET_VIQR)
|
||
)) {
|
||
def_doccsid = 0;
|
||
}
|
||
k = 0;
|
||
pEncoding = &pEncodingInfoTbl[0];
|
||
for (i = 0; i < nEncoding; i++)
|
||
{
|
||
for (j = 0; j < pEncoding->nCodeset; j++)
|
||
{
|
||
if (doc_csid == pEncoding->csid[j])
|
||
{
|
||
if ((def_doccsid == 0) ||
|
||
(def_doccsid == pEncoding->iCSID))
|
||
return i ;
|
||
if (k == 0) k = i;
|
||
}
|
||
}
|
||
pEncoding ++ ;
|
||
}
|
||
// Note!!!: return 0 here is not good idea, but it can avoid crash.
|
||
// need to revisit this code later.
|
||
return k;
|
||
}
|
||
|
||
char * CIntlFont::GetEncodingName(int id)
|
||
{
|
||
if (id < nEncoding)
|
||
return szLoadString(pEncodingInfoTbl[id].iLangResId);
|
||
else // Never should come here
|
||
return "Unknown";
|
||
}
|
||
|
||
void CIntlFont::WriteToIniFile()
|
||
{
|
||
EncodingInfo *pEncoding;
|
||
pEncoding = &pEncodingInfoTbl[0];
|
||
for (int i = 0; i < MAXLANGNUM; i++)
|
||
{
|
||
char key[80];
|
||
|
||
sprintf(key, "intl.font%d.win.prop_font", pEncoding->iCSID);
|
||
PREF_SetCharPref(key, pEncoding->szPropName);
|
||
|
||
sprintf(key, "intl.font%d.win.fixed_font", pEncoding->iCSID);
|
||
PREF_SetCharPref(key, pEncoding->szFixName);
|
||
|
||
sprintf(key, "intl.font%d.win.prop_size", pEncoding->iCSID);
|
||
PREF_SetIntPref(key, (int32)pEncoding->iPropSize);
|
||
|
||
sprintf(key, "intl.font%d.win.fixed_size", pEncoding->iCSID);
|
||
PREF_SetIntPref(key, (int32)pEncoding->iFixSize);
|
||
|
||
pEncoding ++ ;
|
||
}
|
||
}
|
||
|
||
|
||
BYTE IntlGetLfCharset(int csid)
|
||
{
|
||
int id;
|
||
if (csid == 0)
|
||
csid = INTL_DefaultWinCharSetID(0);
|
||
csid = csid & ~CS_AUTO; // mask off AUTO bit
|
||
|
||
if (csid == 0 || csid == CS_LATIN1 || csid == CS_UNKNOWN)
|
||
return ANSI_CHARSET;
|
||
|
||
id = theApp.m_pIntlFont->DocCSIDtoID(csid);
|
||
EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(id);
|
||
return pEncoding->iPropCharset;
|
||
}
|
||
|
||
const char *IntlGetUIFixFaceName(int csid)
|
||
{
|
||
int id ;
|
||
if (csid == 0)
|
||
csid = INTL_DefaultWinCharSetID(0);
|
||
csid = csid & ~CS_AUTO; // mask off AUTO bit
|
||
|
||
id = theApp.m_pIntlFont->DocCSIDtoID(csid);
|
||
EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(id);
|
||
return pEncoding->szFixName;
|
||
}
|
||
|
||
const char *IntlGetUIPropFaceName(int csid)
|
||
{
|
||
int id ;
|
||
if (csid == 0)
|
||
csid = INTL_DefaultWinCharSetID(0);
|
||
csid = csid & ~CS_AUTO; // mask off AUTO bit
|
||
|
||
id = theApp.m_pIntlFont->DocCSIDtoID(csid);
|
||
EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(id);
|
||
return pEncoding->szPropName;
|
||
}
|
||
|
||
|
||
//------------------------------------------------------------
|
||
// Function called from cross-platform code
|
||
//------------------------------------------------------------
|
||
extern "C" int FE_StrColl(const char* s1, const char* s2)
|
||
{
|
||
return lstrcmp(s1, s2);
|
||
}
|
||
|
||
extern "C" size_t FE_StrfTime(MWContext *context, char *result, size_t maxsize, int format,
|
||
const struct tm *timeptr)
|
||
{
|
||
#ifdef XP_WIN16
|
||
switch(format)
|
||
{
|
||
case XP_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%H:%M", timeptr);
|
||
case XP_WEEKDAY_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%a %H:%M", timeptr);
|
||
case XP_DATE_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%x %H:%M", timeptr);
|
||
case XP_LONG_DATE_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%c", timeptr);
|
||
default:
|
||
result[0] = '\0';
|
||
return 0;
|
||
}
|
||
#else
|
||
int wincsid = INTL_DefaultWinCharSetID(context);
|
||
LANGID langid;
|
||
langid = GetSystemDefaultLangID();
|
||
|
||
if ((wincsid & MULTIBYTE) &&
|
||
sysInfo.m_bDBCS &&
|
||
!((GetSystemDefaultLangID() == 0x0411 && wincsid == CS_SJIS) ||
|
||
(GetSystemDefaultLangID() == 0x0412 && wincsid == CS_KSC_8BIT) ||
|
||
(GetSystemDefaultLangID() == 0x0812 && wincsid == CS_KSC_8BIT) ||
|
||
(GetSystemDefaultLangID() == 0x0804 && wincsid == CS_GB_8BIT) ||
|
||
(GetSystemDefaultLangID() == 0x1004 && wincsid == CS_GB_8BIT) ||
|
||
(GetSystemDefaultLangID() == 0x0C04 && wincsid == CS_BIG5) ||
|
||
(GetSystemDefaultLangID() == 0x0404 && wincsid == CS_BIG5)))
|
||
{ // In multibyte, if system doesn't match with current win_csid
|
||
switch(format)
|
||
{
|
||
case XP_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%H:%M", timeptr);
|
||
case XP_WEEKDAY_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%a %H:%M", timeptr);
|
||
case XP_DATE_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%x %H:%M", timeptr);
|
||
case XP_LONG_DATE_TIME_FORMAT:
|
||
return strftime (result, maxsize, "%c", timeptr);
|
||
default:
|
||
result[0] = '\0';
|
||
return 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
SYSTEMTIME daytime;
|
||
int n, m;
|
||
daytime.wYear = 1900 + timeptr->tm_year;
|
||
daytime.wMonth = timeptr->tm_mon + 1;
|
||
daytime.wDayOfWeek = timeptr->tm_wday;
|
||
daytime.wDay = timeptr->tm_mday;
|
||
daytime.wHour = timeptr->tm_hour;
|
||
daytime.wMinute = timeptr->tm_min;
|
||
daytime.wSecond = timeptr->tm_sec;
|
||
daytime.wMilliseconds = 0;
|
||
|
||
*result = '\0';
|
||
|
||
|
||
switch(format)
|
||
{
|
||
case XP_TIME_FORMAT:
|
||
// return strftime (result, maxsize, "%X", timeptr);
|
||
if (n = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &daytime, NULL, result, maxsize))
|
||
return n;
|
||
else
|
||
return strftime (result, maxsize, "%H:%M", timeptr);
|
||
case XP_WEEKDAY_TIME_FORMAT:
|
||
// return strftime (result, maxsize, "%a %X", timeptr);
|
||
if (GetDateFormat(LOCALE_USER_DEFAULT,0,&daytime,"ddd ", result, maxsize))
|
||
{
|
||
n = strlen(result);
|
||
if (m = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &daytime, NULL, result+n, maxsize-n))
|
||
return n + m;
|
||
else
|
||
return strftime (result, maxsize, "%a %H:%M", timeptr);
|
||
}
|
||
else
|
||
return strftime (result, maxsize, "%a %H:%M", timeptr);
|
||
case XP_DATE_TIME_FORMAT:
|
||
// return strftime (result, maxsize, "%x %X", timeptr);
|
||
if (GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE, &daytime,NULL, result, maxsize))
|
||
{
|
||
n = strlen(result);
|
||
result[n++] = ' ';
|
||
if (m = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &daytime, NULL, result+n, maxsize-n))
|
||
return m + n;
|
||
else
|
||
return strftime (result, maxsize, "%x %H:%M", timeptr);
|
||
}
|
||
else
|
||
return strftime (result, maxsize, "%x %H:%M", timeptr);
|
||
case XP_LONG_DATE_TIME_FORMAT:
|
||
// return strftime (result, maxsize, "%x %X", timeptr);
|
||
if (GetDateFormat(LOCALE_USER_DEFAULT,DATE_LONGDATE, &daytime,NULL, result, maxsize))
|
||
{
|
||
n = strlen(result);
|
||
result[n++] = ' ';
|
||
if (m = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &daytime, NULL, result+n, maxsize-n))
|
||
return m + n;
|
||
else
|
||
return strftime (result, maxsize, "%x %H:%M", timeptr);
|
||
}
|
||
else
|
||
return strftime (result, maxsize, "%x %H:%M", timeptr);
|
||
default:
|
||
result[0] = '\0';
|
||
return 0;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
|
||
CXPResSwitcher g_xpResSwitcher;
|
||
|
||
/* XP_GetString
|
||
*
|
||
* This one takes XP string ID (which is used mainly by libnet, libsec)
|
||
* and loads String from resource file (netscape.rc3).
|
||
*/
|
||
extern "C" char *XP_GetString(int id)
|
||
{
|
||
int16 resid;
|
||
resid = id + 7000;
|
||
|
||
char *buf = szLoadString(resid, &g_xpResSwitcher);
|
||
return buf;
|
||
|
||
}
|
||
|
||
/*
|
||
INTL_DocCharSetID and INTL_DefaultDocCharSetID getting closer and closer
|
||
For 2.1, we need to remove one of them.
|
||
*/
|
||
int INTL_DocCharSetID(MWContext *context)
|
||
{
|
||
int doccsid;
|
||
if (context == NULL)
|
||
return theApp.m_iCSID;
|
||
else if (doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context)))
|
||
return doccsid;
|
||
#ifndef MOZ_NGLAYOUT
|
||
else if (context->type == MWContextPrint && ((CPrintCX *)((context)->fe.cx))->m_iCSID)
|
||
return ((CPrintCX *)((context)->fe.cx))->m_iCSID;
|
||
#endif
|
||
else if (GetFrame(context) && GetFrame(context)->m_iCSID)
|
||
return GetFrame(context)->m_iCSID;
|
||
else
|
||
return theApp.m_iCSID;
|
||
}
|
||
|
||
/*
|
||
This routine will retrieve default URL charset Id
|
||
from conversion engine.
|
||
*/
|
||
extern int16 INTL_DefaultDocCharSetID(MWContext * context)
|
||
{
|
||
int doccsid;
|
||
if (context == NULL)
|
||
return theApp.m_iCSID;
|
||
else if (doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context)))
|
||
return doccsid;
|
||
#ifndef MOZ_NGLAYOUT
|
||
else if (context->type == MWContextPrint && ((CPrintCX *)((context)->fe.cx))->m_iCSID)
|
||
return ((CPrintCX *)((context)->fe.cx))->m_iCSID;
|
||
#endif
|
||
else if (context->type == MWContextSaveToDisk && ((CSaveCX*)((context)->fe.cx))->m_iCSID)
|
||
return ((CSaveCX *)((context)->fe.cx))->m_iCSID;
|
||
else if (GetFrame(context) && ((CMainFrame *)GetFrame(context))->m_iCSID)
|
||
return ((CMainFrame *)GetFrame(context))->m_iCSID;
|
||
else
|
||
return theApp.m_iCSID;
|
||
}
|
||
|
||
extern "C" uint16 FE_DefaultDocCharSetID(MWContext * context)
|
||
{
|
||
if (context == NULL)
|
||
return theApp.m_iCSID;
|
||
#ifndef MOZ_NGLAYOUT
|
||
else if (context->type == MWContextPrint && ((CPrintCX *)((context)->fe.cx))->m_iCSID)
|
||
return ((CPrintCX *)((context)->fe.cx))->m_iCSID;
|
||
#endif
|
||
else if (context->type == MWContextSaveToDisk && ((CSaveCX*)((context)->fe.cx))->m_iCSID)
|
||
return ((CSaveCX *)((context)->fe.cx))->m_iCSID;
|
||
else if (GetFrame(context) && ((CMainFrame *)GetFrame(context))->m_iCSID)
|
||
return ((CMainFrame *)GetFrame(context))->m_iCSID;
|
||
else
|
||
return theApp.m_iCSID;
|
||
}
|
||
|
||
/*
|
||
This routine will relayout current document.
|
||
It's called from xp rountine to do CharSet conversion
|
||
based on new doc_csid found from <Meta ...>
|
||
*/
|
||
extern void INTL_Relayout(MWContext * pContext)
|
||
{
|
||
if(pContext == NULL || ABSTRACTCX(pContext) == NULL || ABSTRACTCX(pContext)->IsDestroyed()) {
|
||
// Don't allow this to happen if the context has been destroyed...
|
||
return;
|
||
}
|
||
|
||
// Let the page load, so that it is in the cache (bug fix 51701)
|
||
// or will get a page that is partially "transfer interrupted"
|
||
// if just doing a Reload() as that part of the page is
|
||
// possibly already cached before the entire page is downloaded
|
||
// leading to lossy display.
|
||
// Another way to do this is to ignore the cache altogether for a
|
||
// more immediate effect: Reload(NET_SUPER_RELOAD)
|
||
// but that is not nice to the cache, or the user if working
|
||
// offline, etc.
|
||
#if 0 //#ifdef EDITOR
|
||
if(EDT_IS_EDITOR(pContext)){
|
||
EDT_RefreshLayout(pContext);
|
||
} else
|
||
#endif
|
||
ABSTRACTCX(pContext)->NiceReload();
|
||
}
|
||
|
||
|
||
/*
|
||
See information in
|
||
Unicode Functions Supported by Windows 95
|
||
PSS ID Number: Q125671
|
||
*/
|
||
int CIntlWin::m_iConvBufSize = 0;
|
||
#ifdef XP_WIN32
|
||
LPWSTR CIntlWin::m_wConvBuf = NULL;
|
||
#endif
|
||
|
||
BOOL CIntlWin::FontSelectIgnorePitch(int16 wincsid)
|
||
{
|
||
return ( (wincsid & MULTIBYTE) ||
|
||
(CS_TIS620 == wincsid ) ||
|
||
(CS_ARMSCII8 == wincsid )
|
||
);
|
||
}
|
||
BOOL CIntlWin::FontSelectIgnoreCharset(int16 wincsid)
|
||
{
|
||
return ( UseUnicodeFontAPI(wincsid) ||
|
||
( CS_USER_DEFINED_ENCODING == wincsid)
|
||
);
|
||
}
|
||
BOOL CIntlWin::AllocConvBuffer(int iLength)
|
||
{
|
||
#ifdef WIN32
|
||
if (m_iConvBufSize == 0)
|
||
{
|
||
if (iLength < 1024)
|
||
iLength = 1024;
|
||
m_wConvBuf = (WCHAR *)malloc(iLength);
|
||
m_iConvBufSize = iLength;
|
||
}
|
||
else
|
||
{
|
||
m_wConvBuf = (WCHAR *) realloc(m_wConvBuf, iLength);
|
||
m_iConvBufSize = iLength;
|
||
}
|
||
#endif
|
||
return TRUE;
|
||
}
|
||
|
||
int16 CIntlWin::m_system_locale_csid = 0;
|
||
|
||
int16 CIntlWin::GetSystemLocaleCsid()
|
||
{
|
||
if( 0 == m_system_locale_csid )
|
||
{
|
||
#ifdef XP_WIN32
|
||
m_system_locale_csid = CodePageToCsid(GetACP());
|
||
#else
|
||
m_system_locale_csid = CodePageToCsid(GetKBCodePage()); // In Win3.1 We cannot call GetACP(), we can just call GetKBCodePage()
|
||
#endif
|
||
}
|
||
if( 0 == m_system_locale_csid ) // if still cannot find the csid, Fall back to Latin 1
|
||
{
|
||
m_system_locale_csid = CS_LATIN1;
|
||
}
|
||
return m_system_locale_csid;
|
||
}
|
||
int16 CIntlWin::CodePageToCsid(UINT cp)
|
||
{
|
||
switch(cp)
|
||
{
|
||
case 1250:
|
||
case 852: // MS-DOS Slavic OEM in the case of Win16 GetKBCodePage
|
||
return CS_CP_1250;
|
||
|
||
case 1251:
|
||
case 855: // IBM Cyrillic OEM in the case of Win16 GetKBCodePage
|
||
case 866: // MS-DOS Russian OEM in the case of Win16 GetKBCodePage
|
||
return CS_CP_1251;
|
||
|
||
case 1252:
|
||
case 437: // US OEM in the case of Win16 GetKBCodePage
|
||
case 850: // MS-DOS Multilingual OEM in the case of Win16 GetKBCodePage
|
||
case 860: // MS-DOS Portutuese OEM in the case of Win16 GetKBCodePage
|
||
case 861: // MS-DOS Icelandic OEM in the case of Win16 GetKBCodePage
|
||
case 863: // MS-DOS Canadian-French OEM in the case of Win16 GetKBCodePage
|
||
case 865: // MS-DOS Nordic OEM in the case of Win16 GetKBCodePage
|
||
return CS_LATIN1;
|
||
|
||
case 1253:
|
||
case 737: // Greek OEM in the case of Win16 GetKBCodePage
|
||
case 869: // IBM Modern Greek OEM in the case of Win16 GetKBCodePage
|
||
return CS_CP_1253;
|
||
|
||
case 1254:
|
||
case 857: // IBM Turkish OEM in the case of Win16 GetKBCodePage
|
||
return CS_CP_1254; // CS_CP_1254;
|
||
|
||
case 1255:
|
||
return CS_UNKNOWN; // CS_CP_1255;
|
||
|
||
case 1256:
|
||
return CS_UNKNOWN; // CS_CP_1256;
|
||
|
||
case 775: // Baltic OEM in the case of Win16 GetKBCodePage
|
||
case 1257:
|
||
return CS_UNKNOWN; // CS_CP_1257;
|
||
|
||
case 932:
|
||
return CS_SJIS;
|
||
|
||
case 936:
|
||
return CS_GB_8BIT;
|
||
|
||
case 949:
|
||
case 1361: // Korean (Johab) OEM in the case of Win16 GetKBCodePage
|
||
return CS_KSC_8BIT;
|
||
|
||
case 950:
|
||
return CS_BIG5;
|
||
|
||
case 874:
|
||
return CS_TIS620;
|
||
|
||
default:
|
||
return CS_UNKNOWN;
|
||
}
|
||
}
|
||
int CIntlWin::MultiByteToWideChar(int16 wincsid, LPCSTR lpMultiByte, int iLength)
|
||
{
|
||
if((lpMultiByte == NULL) || (lpMultiByte[0] == '\0') || (iLength == 0))
|
||
return 0;
|
||
#ifdef WIN32
|
||
if (iLength == -1)
|
||
iLength = strlen(lpMultiByte);
|
||
if (((iLength+1) * 2) > m_iConvBufSize)
|
||
AllocConvBuffer((iLength+1) * 2);
|
||
|
||
iLength = INTL_TextToUnicode(wincsid, (unsigned char*)lpMultiByte, iLength, m_wConvBuf, m_iConvBufSize) ;
|
||
#endif
|
||
return iLength;
|
||
}
|
||
//
|
||
// UseUnicodeFontAPI return
|
||
//
|
||
// csid Latin1/Symbol/ UTF8 MultiByte Other Single Byte
|
||
// UserDefined/Digbats J/K/SC/TC CE/Greek/Cyr/Turk
|
||
// Platform
|
||
// Win 95 NonDB FALSE TRUE TRUE FALSE (Need test)
|
||
// Win NT NonDB FALSE TRUE TRUE TRUE (Need test)
|
||
// Win 95 DB FALSE TRUE (1) FALSE
|
||
// Win NT DB FALSE TRUE (1) TRUE(2)
|
||
//
|
||
// (1) FALSE if it is equal to the system locale's csid.
|
||
// (2) Could be true or false. But need more work for Edit control if use TRUE
|
||
//
|
||
#ifdef XP_WIN32
|
||
static BOOL intlUnicodeFlag(int16 wincsid)
|
||
{
|
||
if(! theApp.m_bUseUnicodeFont)
|
||
return FALSE;
|
||
|
||
if(0 == wincsid) // Unknown csid
|
||
return FALSE;
|
||
|
||
if(CS_UTF8 == wincsid)
|
||
return TRUE;
|
||
|
||
if( (CS_LATIN1 == wincsid) || (CS_SYMBOL == wincsid) ||
|
||
(CS_DINGBATS == wincsid) || (CS_USER_DEFINED_ENCODING == wincsid))
|
||
{
|
||
return FALSE;
|
||
}
|
||
if((CS_VIET_VISCII == wincsid) ||
|
||
(CS_VIET_VPS == wincsid) ||
|
||
(CS_VIET_TCVN == wincsid) ||
|
||
(CS_VIET_VIQR == wincsid)
|
||
){
|
||
return FALSE;
|
||
}
|
||
if( wincsid & MULTIBYTE)
|
||
{
|
||
if(CIntlWin::GetSystemLocaleCsid() == wincsid)
|
||
return FALSE;
|
||
else
|
||
return TRUE;
|
||
}
|
||
else // Other SingleByte csid
|
||
{
|
||
if(CS_TIS620 == wincsid)
|
||
return FALSE;
|
||
|
||
if(sysInfo.m_bWinNT)
|
||
return TRUE;
|
||
else
|
||
return FALSE;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
|
||
BOOL CIntlWin::UseVirtualFont()
|
||
{
|
||
return theApp.m_bUseVirtualFont;
|
||
}
|
||
BOOL CIntlWin::GetTextExtentPoint(int wincsid, HDC hDC, LPCSTR pString, int iLength, LPSIZE lpSize)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return FALSE;
|
||
#else
|
||
if(0 == iLength)
|
||
{
|
||
lpSize->cx = 0;
|
||
lpSize->cy = 0;
|
||
return TRUE;
|
||
}
|
||
wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO;
|
||
#ifdef XP_WIN32
|
||
int wlen;
|
||
|
||
if ( CIntlWin::UseUnicodeFontAPI(wincsid))
|
||
{
|
||
// Handle UTF8 by using multifont
|
||
if((wincsid == CS_UTF8) && CIntlWin::UseVirtualFont())
|
||
{
|
||
return CIntlUnicodeVirtualFontStrategy::GetTextExtentPoint(hDC, pString, iLength, lpSize );
|
||
}
|
||
|
||
if(wlen = MultiByteToWideChar(wincsid, pString, iLength))
|
||
{
|
||
return ::GetTextExtentPoint32W(hDC, m_wConvBuf, wlen, lpSize);
|
||
}
|
||
}
|
||
#endif // XP_WIN32
|
||
if(wincsid == CS_UTF8)
|
||
{
|
||
return CIntlUnicodeVirtualFontStrategy::GetTextExtentPoint(hDC, pString, iLength, lpSize );
|
||
}
|
||
|
||
#ifdef XP_WIN32 // The final fallback
|
||
return::GetTextExtentPoint32(hDC, pString, iLength, lpSize);
|
||
#else
|
||
return::GetTextExtentPoint(hDC, pString, iLength, lpSize);
|
||
#endif
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
|
||
BOOL CIntlWin::GetTextExtentPointWithCyaFont(CyaFont *theNSFont,int wincsid, HDC hDC, LPCSTR pString, int iLength, LPSIZE lpSize)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return FALSE;
|
||
#else
|
||
if(0 == iLength)
|
||
{
|
||
lpSize->cx = 0;
|
||
lpSize->cy = 0;
|
||
return TRUE;
|
||
}
|
||
// wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO;
|
||
XP_ASSERT(((wincsid & CS_AUTO) == 0) && (wincsid != CS_JIS) && (wincsid!=CS_EUCJP));
|
||
#ifdef XP_WIN32
|
||
int wlen;
|
||
|
||
if ( CIntlWin::UseUnicodeFontAPI(wincsid))
|
||
{
|
||
// Handle UTF8 by using multifont
|
||
if((wincsid == CS_UTF8) && CIntlWin::UseVirtualFont())
|
||
{
|
||
return CIntlUnicodeVirtualFontStrategy::GetTextExtentPointWithCyaFont(theNSFont,hDC, pString, iLength, lpSize );
|
||
}
|
||
|
||
if(wlen = MultiByteToWideChar(wincsid, pString, iLength))
|
||
{
|
||
return theNSFont->MeasureTextSize(hDC, (char *)m_wConvBuf, wlen*sizeof(*m_wConvBuf), NULL, 0, lpSize);
|
||
}
|
||
}
|
||
#endif // XP_WIN32
|
||
if(wincsid == CS_UTF8)
|
||
{
|
||
return CIntlUnicodeVirtualFontStrategy::GetTextExtentPointWithCyaFont(theNSFont,hDC, pString, iLength, lpSize );
|
||
}
|
||
|
||
return( theNSFont->MeasureTextSize( hDC, (char *)pString, iLength, NULL, 0, lpSize) );
|
||
// #ifdef XP_WIN32 // The final fallback
|
||
// return::GetTextExtentPoint32(hDC, pString, iLength, lpSize);
|
||
// #else
|
||
// return::GetTextExtentPoint(hDC, pString, iLength, lpSize);
|
||
// #endif
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
|
||
CSize CIntlWin::GetTextExtent(int16 wincsid, HDC pDC, LPCTSTR pString, int iLength)
|
||
{
|
||
CSize csSize;
|
||
BOOL bRetval;
|
||
bRetval = CIntlWin::GetTextExtentPoint(wincsid, pDC, pString, iLength, &csSize);
|
||
return(csSize);
|
||
}
|
||
|
||
BOOL CIntlWin::TextOut(int16 wincsid, HDC hDC, int nXStart, int nYStart, LPCSTR lpString,int iLength)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return FALSE;
|
||
#else
|
||
if(0 == iLength)
|
||
return TRUE;
|
||
wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO;
|
||
#ifdef XP_WIN32
|
||
int wlen;
|
||
if ( CIntlWin::UseUnicodeFontAPI(wincsid))
|
||
{
|
||
// Handle UTF8 by using multifont
|
||
if((wincsid == CS_UTF8) && CIntlWin::UseVirtualFont())
|
||
{
|
||
return CIntlUnicodeVirtualFontStrategy::TextOut(
|
||
hDC, nXStart, nYStart, lpString, iLength);
|
||
}
|
||
if(wlen = MultiByteToWideChar(wincsid, lpString, iLength))
|
||
{
|
||
return ::TextOutW(hDC, nXStart, nYStart, m_wConvBuf, wlen);
|
||
}
|
||
}
|
||
#endif // XP_WIN32
|
||
if(wincsid == CS_UTF8)
|
||
{
|
||
return CIntlUnicodeVirtualFontStrategy::TextOut(hDC, nXStart, nYStart, lpString, iLength);
|
||
}
|
||
return ::TextOut(hDC, nXStart, nYStart, lpString, iLength); // The final fallback
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
|
||
//based on BOOL CIntlWin::TextOut(int16 wincsid, HDC hDC, int nXStart, int nYStart, LPCSTR lpString,int iLength)
|
||
BOOL CIntlWin::TextOutWithCyaFont(CyaFont *theNSFont, int16 wincsid, HDC hDC,
|
||
int nXStart, int nYStart, LPCSTR lpString,int iLength)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return FALSE;
|
||
#else
|
||
if(0 == iLength)
|
||
return TRUE;
|
||
#ifdef XP_WIN32
|
||
int wlen;
|
||
if ( CIntlWin::UseUnicodeFontAPI(wincsid))
|
||
{
|
||
// Handle UTF8 by using multifont
|
||
if((wincsid == CS_UTF8) && CIntlWin::UseVirtualFont())
|
||
{
|
||
return( CIntlUnicodeVirtualFontStrategy::TextOutWithCyaFont(theNSFont, hDC, nXStart, nYStart, lpString, iLength) );
|
||
}
|
||
if(wlen = MultiByteToWideChar(wincsid, lpString, iLength))
|
||
{
|
||
// the encording flag in theNSFont makes it call ::TextOutW()
|
||
if( theNSFont->drawText(hDC, nXStart, nYStart, (char *)m_wConvBuf, wlen * 2) == FONTERR_OK)
|
||
return(TRUE);
|
||
else
|
||
return(FALSE);
|
||
// return ::TextOutW(hDC, nXStart, nYStart, m_wConvBuf, wlen);
|
||
}
|
||
}
|
||
#endif // XP_WIN32
|
||
if(wincsid == CS_UTF8)
|
||
{
|
||
// todo
|
||
return CIntlUnicodeVirtualFontStrategy::TextOut(hDC, nXStart, nYStart, lpString, iLength);
|
||
}
|
||
//return ::TextOut(hDC, nXStart, nYStart, lpString, iLength); // The final fallback
|
||
if( theNSFont->drawText(hDC, nXStart, nYStart, (char *)lpString, iLength) == FONTERR_OK )
|
||
return(TRUE);
|
||
else
|
||
return(FALSE);
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
|
||
// *** Fix Me: Need to change to support UTF8
|
||
BOOL CIntlWin::ExtTextOut(int16 wincsid, HDC pDC, int x, int y, UINT nOptions, LPCRECT lpRect, LPCSTR lpszString, UINT nCount, LPINT lpDxWidths)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return FALSE;
|
||
#else
|
||
if(0 == nCount)
|
||
return TRUE;
|
||
wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO;
|
||
#ifdef XP_WIN32
|
||
int wlen;
|
||
if ( CIntlWin::UseUnicodeFontAPI(wincsid))
|
||
{
|
||
// Handle UTF8 by using multifont
|
||
if((wincsid == CS_UTF8) && CIntlWin::UseVirtualFont())
|
||
{
|
||
// Fix Me: For now, igore the option and rect. Just use TextOut
|
||
// Need to implement the CIntlUnicodeVirtualFontStrategy::ExTextOut() later
|
||
return CIntlUnicodeVirtualFontStrategy::TextOut(
|
||
pDC, x, y, lpszString, nCount);
|
||
}
|
||
if(wlen = MultiByteToWideChar(wincsid, lpszString, nCount))
|
||
{
|
||
return ::ExtTextOutW(pDC, x, y, nOptions, lpRect, m_wConvBuf, wlen, lpDxWidths);
|
||
}
|
||
}
|
||
#endif
|
||
if(wincsid == CS_UTF8)
|
||
{
|
||
// Fix Me: For now, igore the option and rect. Just use TextOut
|
||
// Need to implement the CIntlUnicodeVirtualFontStrategy::ExTextOut() later
|
||
return CIntlUnicodeVirtualFontStrategy::TextOut(
|
||
pDC, x, y, lpszString, nCount);
|
||
}
|
||
return ::ExtTextOut(pDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths);
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
|
||
#ifdef XP_WIN32
|
||
int CIntlWin::DrawTextEx(int16 wincsid, HDC hdc, LPSTR lpchText, int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return 0;
|
||
#else
|
||
wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO;
|
||
|
||
int iRetval;
|
||
int wlen;
|
||
if (cchText == -1)
|
||
cchText = strlen(lpchText);
|
||
|
||
if ( CIntlWin::UseUnicodeFontAPI(wincsid))
|
||
{
|
||
|
||
// DrawTextExW and DrawTextW is not working on Win95 right now. See Note above
|
||
if( (!((wincsid == CS_UTF8) && CIntlWin::UseVirtualFont()))
|
||
&& (sysInfo.m_bWinNT)
|
||
&& (wlen = MultiByteToWideChar(wincsid, lpchText, cchText))
|
||
)
|
||
{
|
||
return ::DrawTextW(hdc, m_wConvBuf, wlen, lprc, dwDTFormat);
|
||
}
|
||
int x, y;
|
||
SIZE sz;
|
||
CIntlWin::GetTextExtentPoint(wincsid, hdc, lpchText, cchText, &sz);
|
||
|
||
// Caculate X
|
||
x = lprc->left;
|
||
if(dwDTFormat & DT_CENTER)
|
||
x = (lprc->right + lprc->right - sz.cx) / 2;
|
||
else if(dwDTFormat & DT_RIGHT)
|
||
x = lprc->right - sz.cx;
|
||
|
||
// Caculate Y
|
||
y = lprc->top ;
|
||
if(dwDTFormat & DT_VCENTER)
|
||
y = ( lprc->top + lprc->bottom - sz.cy ) / 2;
|
||
else if(dwDTFormat & DT_BOTTOM)
|
||
y = lprc->bottom - sz.cy;
|
||
|
||
if(dwDTFormat & DT_CALCRECT)
|
||
{
|
||
lprc->right = x + sz.cx;
|
||
return sz.cy;
|
||
}
|
||
return CIntlWin::TextOut(wincsid, hdc, x, y, lpchText, cchText);
|
||
}
|
||
else
|
||
{
|
||
if (sysInfo.m_bWinNT)
|
||
iRetval = ::DrawText(hdc, lpchText, cchText, lprc, dwDTFormat);
|
||
else
|
||
iRetval = ::DrawTextEx(hdc, lpchText, cchText, lprc, dwDTFormat, lpDTParams);
|
||
}
|
||
return iRetval;
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
#endif
|
||
|
||
int CIntlWin::DrawText(int16 wincsid, HDC hdc, LPSTR lpchText, int cchText,LPRECT lprc,UINT dwDTFormat)
|
||
{
|
||
#ifdef MOZ_NGLAYOUT
|
||
XP_ASSERT(0);
|
||
return 0;
|
||
#else
|
||
#ifdef _WIN32
|
||
return CIntlWin::DrawTextEx( wincsid, hdc, lpchText, cchText, lprc, dwDTFormat, NULL);
|
||
#else
|
||
wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO;
|
||
if (cchText == -1)
|
||
cchText = strlen(lpchText);
|
||
|
||
if(wincsid == CS_UTF8)
|
||
{
|
||
int x, y;
|
||
SIZE sz;
|
||
CIntlUnicodeVirtualFontStrategy::GetTextExtentPoint(hdc, lpchText, cchText, &sz);
|
||
|
||
// Caculate X
|
||
x = lprc->left;
|
||
if(dwDTFormat & DT_CENTER)
|
||
x = (lprc->right + lprc->right - sz.cx) / 2;
|
||
else if(dwDTFormat & DT_RIGHT)
|
||
x = lprc->right - sz.cx;
|
||
|
||
// Caculate Y
|
||
y = lprc->top;
|
||
if(dwDTFormat & DT_VCENTER)
|
||
y = ( lprc->top + lprc->bottom - sz.cy ) / 2;
|
||
else if(dwDTFormat & DT_BOTTOM)
|
||
y = lprc->bottom - sz.cy;
|
||
|
||
if(dwDTFormat & DT_CALCRECT)
|
||
{
|
||
lprc->right = x + sz.cx;
|
||
return sz.cy;
|
||
}
|
||
return CIntlUnicodeVirtualFontStrategy::TextOut(hdc, x, y, lpchText, cchText);
|
||
}
|
||
return ::DrawText(hdc, lpchText, cchText, lprc, dwDTFormat );
|
||
#endif
|
||
#endif /* MOZ_NGLAYOUT */
|
||
}
|
||
|
||
extern "C" void *FE_GetSingleByteTable(int16 from_csid, int16 to_csid, int resourceid)
|
||
{
|
||
HRSRC hrsrc;
|
||
HGLOBAL hRes;
|
||
char szName[256];
|
||
|
||
strcpy(szName, (const char *)INTL_CsidToCharsetNamePt(from_csid));
|
||
strcpy(szName + strlen(szName), "_TO_");
|
||
strcpy(szName + strlen(szName), (const char *)INTL_CsidToCharsetNamePt(to_csid));
|
||
for (char *p = szName; *p; p++)
|
||
{
|
||
if (*p == '-') *p = '_';
|
||
}
|
||
|
||
hrsrc = ::FindResource(AfxGetResourceHandle(), szName, RT_RCDATA);
|
||
|
||
XP_ASSERT(hrsrc);
|
||
|
||
if (!hrsrc) {
|
||
TRACE1("FE_GetSingleByteTable cannot find resource: %s\n", szName);
|
||
return NULL;
|
||
}
|
||
|
||
hRes = ::LoadResource(AfxGetResourceHandle(), hrsrc);
|
||
|
||
XP_ASSERT(hRes);
|
||
|
||
if (!hRes) {
|
||
TRACE1("FE_GetSingleByteTable cannot load resource: %s\n", szName);
|
||
return NULL;
|
||
}
|
||
|
||
return (void *) hRes;
|
||
}
|
||
|
||
extern "C" char *FE_LockTable(void **hres)
|
||
{
|
||
return (LPSTR)::LockResource((HGLOBAL) hres);
|
||
}
|
||
|
||
extern "C" void FE_FreeSingleByteTable(void **hres)
|
||
{
|
||
#ifndef XP_WIN32
|
||
::UnlockResource((HGLOBAL) hres);
|
||
#endif
|
||
::FreeResource((HGLOBAL) hres);
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
#define MAXNUMOFCSIDLIST 64
|
||
#define UNICODECONVERSIONCHARTLIST "UnicodeConversionCharsetList"
|
||
|
||
|
||
#ifdef XP_WIN32
|
||
#define UNICODEDLL "UNI3200.DLL"
|
||
#define LIBRARYLOADOK(l) (l != NULL)
|
||
#define UNICODE_VERIFYCSIDLIST_SYM "UNICODE_VERIFYCSIDLIST"
|
||
#else
|
||
#define UNICODEDLL "UNI1600.DLL"
|
||
#define LIBRARYLOADOK(l) (l > HINSTANCE_ERROR)
|
||
#define UNICODE_VERIFYCSIDLIST_SYM "_UNICODE_VERIFYCSIDLIST"
|
||
#endif
|
||
|
||
static int intl_VerifyCsidList(int inNumOfItem, int16 *csidlist)
|
||
{
|
||
int iRetval = 0;
|
||
HINSTANCE hUniLib = LoadLibrary(UNICODEDLL);
|
||
if(LIBRARYLOADOK(hUniLib)) {
|
||
typedef int (*func)(int, int16 *);
|
||
func VerifyProc = (func)GetProcAddress(hUniLib, UNICODE_VERIFYCSIDLIST_SYM);
|
||
ASSERT(VerifyProc);
|
||
if(VerifyProc) {
|
||
iRetval = VerifyProc(inNumOfItem, csidlist);
|
||
VerifyProc = NULL;
|
||
}
|
||
|
||
FreeLibrary(hUniLib);
|
||
hUniLib = NULL;
|
||
}
|
||
return(iRetval);
|
||
}
|
||
|
||
//
|
||
// Read and Write charset List for Unicode conversion
|
||
//
|
||
static void intl_ReadUnicodeConvList()
|
||
{
|
||
CString charsetlist;
|
||
int16 csidlist[MAXNUMOFCSIDLIST];
|
||
int num_of_csid;
|
||
|
||
// Find the charsetlist from preference
|
||
charsetlist = theApp.GetProfileString("INTL", UNICODECONVERSIONCHARTLIST, "");
|
||
|
||
// If we cannot find it from preference , find it from resource
|
||
if(strlen((const char*)charsetlist) == 0)
|
||
charsetlist = szLoadString(IDS_CHARSET_LIST_FOR_UNICODE);
|
||
|
||
// Otherwise, it is very wrong, however, we still give it
|
||
// CS_LATIN1 , CS_SYMBOL, and CS_DINGBATS
|
||
if(strlen((const char*)charsetlist) == 0)
|
||
charsetlist =
|
||
"iso-8859-1,x-cp1250,x-cp1251,x-cp1253,iso-8859-9,Shift_JIS,euc-kr,gb2312,big5,adobe-symbol-encoding,x-dingbats";
|
||
|
||
for(num_of_csid=0; num_of_csid < MAXNUMOFCSIDLIST; )
|
||
{
|
||
int duplicate;
|
||
int csid;
|
||
int i;
|
||
int lastone = 0;
|
||
int len = charsetlist.GetLength();
|
||
int thislen = charsetlist.Find(',');
|
||
if(thislen == -1)
|
||
{
|
||
lastone = 1;
|
||
thislen = len;
|
||
}
|
||
|
||
csid=INTL_CharSetNameToID((char *)(const char *)charsetlist.Left(thislen));
|
||
// Check to see is that duplicate ?
|
||
for(i=0, duplicate=0;i < num_of_csid; i ++)
|
||
{
|
||
if(csid == csidlist[i])
|
||
duplicate = 1;
|
||
}
|
||
// If not duplicate, add it to the list
|
||
if(duplicate == 0 )
|
||
csidlist[num_of_csid++] = csid;
|
||
|
||
if(lastone == 0 )
|
||
charsetlist = charsetlist.Right(len - thislen - 1);
|
||
else
|
||
break;
|
||
}
|
||
// Write it to the Prefs
|
||
intl_WriteUnicodeConvList(num_of_csid, csidlist);
|
||
|
||
// Filter through our csid checking code - intl_VerifyCsidList()
|
||
num_of_csid = intl_VerifyCsidList(num_of_csid, csidlist);
|
||
|
||
// OK, now we have the list. Call the xp function to initialize
|
||
// Unicode Converter
|
||
INTL_SetUnicodeCSIDList(num_of_csid, csidlist);
|
||
|
||
}
|
||
static void intl_WriteUnicodeConvList(int num_of_csid, int16* csidlist)
|
||
{
|
||
char str[512];
|
||
int first, i;
|
||
char * cur;
|
||
// Now, convert those csid to string
|
||
for(first=1,i=0,cur=str;i < num_of_csid;i++)
|
||
{
|
||
if(first)
|
||
first = 0;
|
||
else
|
||
*cur++ = ',';
|
||
INTL_CharSetIDToName(csidlist[i], cur);
|
||
cur += strlen(cur);
|
||
}
|
||
// And write to the Profile
|
||
theApp.WriteProfileString("INTL", UNICODECONVERSIONCHARTLIST, str);
|
||
}
|
||
|
||
|
||
extern "C" {
|
||
|
||
BYTE IntlGetJavaCharset(int csid, int javaFontID)
|
||
{
|
||
// currently, we ignore javaFontID. We may need to use it later
|
||
switch(csid)
|
||
{
|
||
case CS_DINGBATS:
|
||
case CS_SYMBOL:
|
||
return SYMBOL_CHARSET;
|
||
default:
|
||
return IntlGetLfCharset(csid);
|
||
}
|
||
}
|
||
const char* IntlGetJavaFaceName(int csid, int javaFontID)
|
||
{
|
||
switch(csid)
|
||
{
|
||
case CS_DINGBATS:
|
||
return "Wingdings";
|
||
case CS_SYMBOL:
|
||
return "Symbol";
|
||
default:
|
||
switch(javaFontID)
|
||
{
|
||
case javaFontTimesRoman:
|
||
case javaFontDialog:
|
||
case javaFontHelvetica:
|
||
return IntlGetUIPropFaceName(csid);
|
||
case javaFontDialogInput:
|
||
case javaFontCourier:
|
||
return IntlGetUIFixFaceName(csid);
|
||
default:
|
||
return IntlGetUIPropFaceName(csid);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
extern "C" {
|
||
|
||
PR_PUBLIC_API(const char* )
|
||
INTLGETJAVAFACENAME_E(int csid, int javaFontID)
|
||
{ return IntlGetJavaFaceName(csid, javaFontID); }
|
||
PR_PUBLIC_API(BYTE )
|
||
INTLGETJAVACHARSET_E(int csid, int javaFontID)
|
||
{ return IntlGetJavaCharset(csid, javaFontID); }
|
||
PR_PUBLIC_API(int16* )
|
||
INTL_GETUNICODECSIDLIST_E(int16 * outnum)
|
||
{ return INTL_GetUnicodeCSIDList(outnum); }
|
||
PR_PUBLIC_API(int32 )
|
||
INTL_UNICODELEN_E(uint16* ustr)
|
||
{ return INTL_UnicodeLen(ustr); }
|
||
PR_PUBLIC_API(INTL_CompoundStr* )
|
||
INTL_COMPOUNDSTRFROMUNICODE_E(uint16* inunicode, uint32 inlen)
|
||
{ return INTL_CompoundStrFromUnicode(inunicode, inlen); }
|
||
PR_PUBLIC_API(void )
|
||
INTL_COMPOUNDSTRDESTROY_E(INTL_CompoundStr* This)
|
||
{ INTL_CompoundStrDestroy(This); }
|
||
PR_PUBLIC_API(INTL_CompoundStrIterator )
|
||
INTL_COMPOUNDSTRFIRSTSTR_E(INTL_CompoundStr* This, INTL_Encoding_ID *outencoding, unsigned char** outtext)
|
||
{ return INTL_CompoundStrFirstStr(This, outencoding,outtext); }
|
||
PR_PUBLIC_API(INTL_CompoundStrIterator )
|
||
INTL_COMPOUNDSTRNEXTSTR_E(INTL_CompoundStrIterator iterator, INTL_Encoding_ID *outencoding, unsigned char** outtext)
|
||
{ return INTL_CompoundStrNextStr(iterator, outencoding, outtext); }
|
||
PR_PUBLIC_API(INTL_CompoundStr* )
|
||
INTL_COMPOUNDSTRCLONE_E(INTL_CompoundStr* s1)
|
||
{ return INTL_CompoundStrClone(s1); }
|
||
PR_PUBLIC_API(int16 )
|
||
INTL_DEFAULTWINCHARSETID_E(MWContext *context)
|
||
{ return INTL_DefaultWinCharSetID(context); }
|
||
PR_PUBLIC_API(int32 )
|
||
INTL_TEXTBYTECOUNTTOCHARLEN_E(int16 csid, unsigned char* text, uint32 byteCount)
|
||
{ return INTL_TextByteCountToCharLen(csid, text, byteCount); }
|
||
PR_PUBLIC_API(int32 )
|
||
INTL_TEXTCHARLENTOBYTECOUNT_E(int16 csid, unsigned char* text, uint32 charLen)
|
||
{ return INTL_TextCharLenToByteCount(csid, text, charLen); }
|
||
PR_PUBLIC_API(uint32 )
|
||
INTL_UNICODETOSTRLEN_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr, uint32 ustrlen)
|
||
{ return INTL_UnicodeToStrLen(encoding,ustr,ustrlen); }
|
||
PR_PUBLIC_API(void )
|
||
INTL_UNICODETOSTR_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr,uint32 ustrlen,unsigned char* dest, uint32 destbuflen)
|
||
{ INTL_UnicodeToStr(encoding,ustr,ustrlen,dest,destbuflen); }
|
||
|
||
#ifdef JAVA
|
||
PR_PUBLIC_API(jref * )
|
||
INTL_MAKEJAVASTRING_E(int16 encoding, char *str, int len)
|
||
{ return intl_makeJavaString(encoding, str, len); }
|
||
#endif // JAVA
|
||
|
||
PR_PUBLIC_API(BOOL )
|
||
CINTLWIN_TEXTOUT_E(int16 wincsid, HDC hdc, int nXStart, int nYStart, LPCSTR lpString,int iLength)
|
||
{ return CIntlWin::TextOut( wincsid, hdc, nXStart, nYStart, lpString, iLength); }
|
||
PR_PUBLIC_API(BOOL )
|
||
CINTLWIN_GETTEXTEXTENTPOINT_E(int wincsid, HDC hDC, LPCSTR lpString, int cbString, LPSIZE lpSize)
|
||
{ return CIntlWin::GetTextExtentPoint( wincsid, hDC, lpString, cbString, lpSize); }
|
||
|
||
}; // extern "C"
|