Milán Major

netscape-revival

1 branch
Code

sun-java/awt/win/awt_i18n.cpp

#include "awt_defs.h"
#include "awt_window.h"
#include "awt_i18n.h"
#include "libi18n.h"
#include "prlink.h"

PRLibrary* uniLib = NULL;

extern "C" {
#include "java_lang_String.h"
};

#ifdef XP_WIN32
#define UNICODEDLL					"UNI3200.DLL"
#define LIBRARYLOADOK(l)			(l != NULL)
#define	MODULE_APP					::GetModuleHandle(NULL)

#define	INTLGETJAVAFACENAME_SYM			"IntlGetJavaFaceName_e"
#define INTLGETJAVACHARSET_SYM			"IntlGetJavaCharset_e"

#define	UNICODE_MENU_FONTCSID_SYM		"UNICODE_MenuFontCsid"
#define UNICODE_MENU_FONTID_SYM			"UNICODE_MenuFontID"

#define INTL_GETUNICODECSIDLIST_SYM		"INTL_GetUnicodeCSIDList_e"
#define INTL_UNICODELEN_SYM				"INTL_UnicodeLen_e"
#define INTL_COMPOUNDSTRFROMUNICODE_SYM	"INTL_CompoundStrFromUnicode_e"
#define INTL_COMPOUNDSTRDESTROY_SYM		"INTL_CompoundStrDestroy_e"
#define INTL_COMPOUNDSTRFIRSTSTR_SYM	"INTL_CompoundStrFirstStr_e"
#define INTL_COMPOUNDSTRNEXTSTR_SYM		"INTL_CompoundStrNextStr_e"
#define INTL_COMPOUNDSTRCLONE_SYM		"INTL_CompoundStrClone_e"
#define INTL_DEFAULTWINCHARSETID_SYM	"INTL_DefaultWinCharSetID_e"
#define	INTL_TEXTBYTECOUNTTOCHARLEN_SYM	"INTL_TextByteCountToCharLen_e"
#define INTL_TEXTCHARLENTOBYTECOUNT_SYM	"INTL_TextCharLenToByteCount_e"
#define	INTL_UNICODETOSTRLEN_SYM		"INTL_UnicodeToStrLen_e"
#define	INTL_UNICODETOSTR_SYM			"INTL_UnicodeToStr_e"
#define INTL_MAKEJAVASTRING_SYM			"intl_makeJavaString_e"

#define CINTLWIN_TEXTOUT_SYM			"CIntlWin_TextOut_e"
#define	CINTLWIN_GETTEXTEXTENTPOINT_SYM	"CIntlWin_GetTextExtentPoint_e"

#else	// WIN32
#define UNICODEDLL					"UNI1600.DLL"
#define LIBRARYLOADOK(l)			(((int)l) >= 32)
#define	MODULE_APP					NULL

#define	INTLGETJAVAFACENAME_SYM			"_IntlGetJavaFaceName_e"
#define INTLGETJAVACHARSET_SYM			"_IntlGetJavaCharset_e"

#define	UNICODE_MENU_FONTCSID_SYM		"_UNICODE_MenuFontCsid"
#define UNICODE_MENU_FONTID_SYM			"_UNICODE_MenuFontID"

#define INTL_GETUNICODECSIDLIST_SYM		"_INTL_GetUnicodeCSIDList_e"
#define INTL_UNICODELEN_SYM				"_INTL_UnicodeLen_e"
#define INTL_COMPOUNDSTRFROMUNICODE_SYM	"_INTL_CompoundStrFromUnicode_e"
#define INTL_COMPOUNDSTRDESTROY_SYM		"_INTL_CompoundStrDestroy_e"
#define INTL_COMPOUNDSTRFIRSTSTR_SYM	"_INTL_CompoundStrFirstStr_e"
#define INTL_COMPOUNDSTRNEXTSTR_SYM		"_INTL_CompoundStrNextStr_e"
#define INTL_COMPOUNDSTRCLONE_SYM		"_INTL_CompoundStrClone_e"
#define INTL_DEFAULTWINCHARSETID_SYM	"_INTL_DefaultWinCharSetID_e"
#define	INTL_TEXTBYTECOUNTTOCHARLEN_SYM	"_INTL_TextByteCountToCharLen_e"
#define INTL_TEXTCHARLENTOBYTECOUNT_SYM	"_INTL_TextCharLenToByteCount_e"
#define	INTL_UNICODETOSTRLEN_SYM		"_INTL_UnicodeToStrLen_e"
#define	INTL_UNICODETOSTR_SYM			"_INTL_UnicodeToStr_e"
#define INTL_MAKEJAVASTRING_SYM			"_intl_makeJavaString_e"

#endif

#ifdef INTLUNICODE
//
//	Wrapper Function
//
const char*	
libi18n::IntlGetJavaFaceName(int i1, int i2)
{
	typedef const char* (*f)(int, int);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTLGETJAVAFACENAME_SYM));
	if(p)
		return (*p)(i1,i2);
	else
		return "";
}

BYTE			
libi18n::IntlGetJavaCharset(int i1, int i2)
{
	typedef BYTE (*f)(int, int);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTLGETJAVACHARSET_SYM));
	if(p)
		return (*p)(i1,i2);
	else
		return 0;
}
int16	
libi18n::IntlMenuFontCsid()
{
	static int16 menuFontCsid = CS_DEFAULT;
	if(menuFontCsid != CS_DEFAULT)
			return menuFontCsid;	// Cache systemFontCsid for performance issue. 

	int16 ret = CS_LATIN1;
	if (uniLib == NULL)
		uniLib = PR_LoadLibrary(UNICODEDLL);
	if(uniLib)
	{
		typedef int16 (*f)();
		f p = NULL;
		VERIFY(p = (f) PR_FindSymbol(UNICODE_MENU_FONTCSID_SYM, uniLib));
		if(p)
			ret = (menuFontCsid = (*p)());
	}
	return ret;
}
int	
libi18n::IntlMenuFontID()
{
	static int menuFontID = 0;
	if(menuFontID != 0)
			return menuFontID;	// Cache systemFontCsid for performance issue. 

	int ret = SYSTEM_FONT;
	if( uniLib == NULL)
		uniLib = PR_LoadLibrary(UNICODEDLL);
	if(uniLib)
	{
		typedef int16 (*f)();
		f p = NULL;
		VERIFY(p = (f) PR_FindSymbol(UNICODE_MENU_FONTID_SYM, uniLib));
		if(p)
			ret = (menuFontID = (*p)());
	}
	return ret;
}

int16*		
libi18n::INTL_GetUnicodeCSIDList(int16* i1)
{
	typedef int16* (*f)(int16*);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_GETUNICODECSIDLIST_SYM));
	if(p)
		return (*p)(i1);
	else
		return NULL;
}

int32		
libi18n::INTL_UnicodeLen(uint16* i1)
{
	typedef int32 (*f)(uint16*);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_UNICODELEN_SYM));
	if(p)
		return (*p)(i1);
	else
		return 0;
}

INTL_CompoundStr* 
libi18n::INTL_CompoundStrFromUnicode(uint16* i1, uint32 i2)
{
	typedef INTL_CompoundStr* (*f)(uint16*, uint32);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_COMPOUNDSTRFROMUNICODE_SYM));
	if(p)
		return (*p)(i1,i2);
	else
		return NULL;
}

void			
libi18n::INTL_CompoundStrDestroy(INTL_CompoundStr* i1)
{
	typedef void* (*f)(INTL_CompoundStr*);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_COMPOUNDSTRDESTROY_SYM));
	if(p)
		 (*p)(i1);
}

INTL_CompoundStrIterator 
libi18n::INTL_CompoundStrFirstStr(INTL_CompoundStr* i1, INTL_Encoding_ID *i2, unsigned char** i3)
{
	typedef INTL_CompoundStrIterator (*f)(INTL_CompoundStr*, INTL_Encoding_ID*, unsigned char**);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_COMPOUNDSTRFIRSTSTR_SYM));
	if(p)
		return (*p)(i1,i2,i3);
	else
		return NULL;
}

INTL_CompoundStrIterator 
libi18n::INTL_CompoundStrNextStr(INTL_CompoundStrIterator i1, INTL_Encoding_ID *i2, unsigned char** i3)
{
	typedef INTL_CompoundStrIterator (*f)(INTL_CompoundStrIterator, INTL_Encoding_ID*, unsigned char**);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_COMPOUNDSTRNEXTSTR_SYM));
	if(p)
		return (*p)(i1,i2,i3);
	else
		return NULL;
}

INTL_CompoundStr* 		
libi18n::INTL_CompoundStrClone(INTL_CompoundStr* i1)
{
	typedef INTL_CompoundStr* (*f)(INTL_CompoundStr*);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_COMPOUNDSTRCLONE_SYM));
	if(p)
		return (*p)(i1);
	else
		return NULL;
}
int16		
libi18n::INTL_DefaultWinCharSetID(MWContext *i1)
{
	typedef int16 (*f)(MWContext*);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_DEFAULTWINCHARSETID_SYM));
	if(p)
		return (*p)(i1);
	else
		return 0;
}

int32		
libi18n::INTL_TextByteCountToCharLen(int16 i1, unsigned char* i2, uint32 i3)
{
	typedef int32 (*f)(int16,unsigned char*,uint32 );
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_TEXTBYTECOUNTTOCHARLEN_SYM));
	if(p)
		return (*p)(i1,i2,i3);
	else
		return 0;
}

int32		
libi18n::INTL_TextCharLenToByteCount(int16 i1, unsigned char* i2, uint32 i3)
{
	typedef int32 (*f)(int16, unsigned char*, uint32 );
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_TEXTCHARLENTOBYTECOUNT_SYM));
	if(p)
		return (*p)(i1,i2,i3);
	else
		return 0;
}

uint32		
libi18n::INTL_UnicodeToStrLen(INTL_Encoding_ID i1,INTL_Unicode* i2, uint32 i3)
{
	typedef uint32 (*f)(INTL_Encoding_ID, INTL_Unicode*, uint32);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_UNICODETOSTRLEN_SYM));
	if(p)
		return (*p)(i1,i2,i3);
	else
		return 0;
}

void			
libi18n::INTL_UnicodeToStr(INTL_Encoding_ID i1,INTL_Unicode* i2,uint32 i3,unsigned char* i4, uint32 i5)
{
	typedef void (*f)(INTL_Encoding_ID, INTL_Unicode*, uint32, unsigned char*, uint32);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_UNICODETOSTR_SYM));
	if(p)
		(*p)(i1,i2,i3,i4,i5);
}

jref *
libi18n::intl_makeJavaString(int16 i1, char *i2, int i3)
{
	typedef jref* (*f)(int16, char*, int);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, INTL_MAKEJAVASTRING_SYM));
	if(p)
		return (*p)(i1,i2,i3);
	else
		return 0;
}

//
//	Abstract from the libi18n
//
int16
libi18n::GetPrimaryEncoding()
{
	return libi18n::INTL_DefaultWinCharSetID(0);
}

uint32 
libi18n::intl_javaStringCommon(Hjava_lang_String *javaStringHandle, 
		WCHAR**    uniChars)
{
	HArrayOfChar* unicodeArrayHandle = 
		(HArrayOfChar *)unhand( javaStringHandle )->value;
	*uniChars =  unhand(unicodeArrayHandle)->body 
			+ unhand( javaStringHandle )->offset;
	return unhand( javaStringHandle )->count;
}
void 
libi18n::intl_javaString2CString(int16 encoding , 
		Hjava_lang_String *javaStringHandle, 
		unsigned char *out, uint32 buflen)
{
	uint32      length = 0;
	WCHAR     emptyString = 0;
	WCHAR*    uniChars = &emptyString;
	if( javaStringHandle != NULL )
		length = intl_javaStringCommon(javaStringHandle, &uniChars);
	libi18n::INTL_UnicodeToStr(encoding, uniChars, length,  out, buflen);
}


BOOL 
libi18n::CIntlWin_TextOut(int16 i1, HDC i2, int i3, int i4, LPCSTR  i5,int  i6)
{
#ifdef _WIN32
    typedef BOOL (*f)(int16, HDC, int, int, LPCSTR ,int );
    f p = NULL;
    VERIFY(p = (f) ::GetProcAddress(MODULE_APP, CINTLWIN_TEXTOUT_SYM));
    if(p)
        return (*p)(i1,i2,i3,i4,i5,i6);
    else
        return FALSE;
#else // _WIN32
    return ::TextOut(i2,i3,i4,i5,i6);      
#endif // _WIN32
}
BOOL 
libi18n::CIntlWin_GetTextExtentPoint(int i1, HDC i2, LPCSTR i3, int i4, LPSIZE i5)
{
#ifdef _WIN32
	typedef BOOL (*f)(int, HDC, LPCSTR, int, LPSIZE);
	f p = NULL;
	VERIFY(p = (f) ::GetProcAddress(MODULE_APP, CINTLWIN_GETTEXTEXTENTPOINT_SYM	));
	if(p)
		return (*p)(i1,i2,i3,i4,i5);
	else
		return FALSE;
#else // _WIN32
    return ::GetTextExtentPoint(i2,i3,i4,i5);
#endif // _WIN32
}



char * 
libi18n::intl_allocCString(int16 encoding , Hjava_lang_String *javaStringHandle) 
{
	uint32        length;
	WCHAR     emptyString = 0;
	WCHAR*    uniChars = &emptyString;
	if( javaStringHandle != NULL )
	{
		length = libi18n::intl_javaStringCommon(javaStringHandle, 
							&uniChars);
	}
	uint32 buflen = libi18n::INTL_UnicodeToStrLen(encoding, uniChars, length);
    unsigned char * buf = (unsigned char *)malloc(buflen);
    CHECK_NULL_AND_RETURN(buf, "intl_allocCString:: Out of Memory",0);
	libi18n::INTL_UnicodeToStr(encoding, uniChars, length, buf, buflen);
	return (char*)buf;
}


AwtVFontList* libi18n::s_MenuVFontList = NULL;
HDC libi18n::s_MenuHDC = NULL;
HBITMAP	libi18n::s_CheckmarkBitmap = NULL;

AwtVFontList*
libi18n::GetMenuVFontList()
{
	if(s_MenuVFontList == NULL)
	{
		HDC hDC = libi18n::GetMenuDC();
		::SelectObject(hDC, GetStockObject(libi18n::IntlMenuFontID()));
		TEXTMETRIC metrics;
		VERIFY(::GetTextMetrics(hDC, &metrics));
		s_MenuVFontList = new AwtVFontList(	
							metrics.tmHeight, 
							metrics.tmWeight , 
							metrics.tmItalic, 
							0);
		VERIFY(s_MenuVFontList);
	}
	return s_MenuVFontList;
}
HDC
libi18n::GetMenuDC()
{
	if(s_MenuHDC == NULL)
	{
		s_MenuHDC = CreateIC("DISPLAY", NULL, NULL, NULL);
		VERIFY(s_MenuHDC);
	}
	return s_MenuHDC;
}
BOOL libi18n::iswin95()
{
#if 1
	return TRUE;
#else
	static BOOL initialized = FALSE;
	static BOOL iswin95 = FALSE;
	if(initialized)
		return iswin95;
	// The following code are copy from styles.cpp
	DWORD	dwVer = GetVersion();
	int iVer = (LOBYTE(LOWORD(dwVer))*100) + HIBYTE(LOWORD(dwVer));
	if( iVer >= 395)
		iswin95 = TRUE;
	else
		iswin95 = FALSE;
	initialized = TRUE;
	return iswin95;
#endif
}
HBITMAP	
libi18n::GetCheckmarkBitmap()
{
	if(s_CheckmarkBitmap == NULL)
	{	
		if(libi18n::iswin95())
		{
			static	BYTE win95check[] = {
				0xff, 0x00, 
				0xfe, 0x00, 
				0xfc, 0x00, 
				0xb8, 0x00, 
				0x91, 0x00, 
				0x83, 0x00, 
				0xc7, 0x00, 
				0xef, 0x00, 
			};
			s_CheckmarkBitmap = CreateBitmap(8,8,1,1,win95check);
		}
		else
		{
			static	BYTE win16check[] = {
				0xfe, 0x00, 
				0xfe, 0x00, 
				0xfc, 0x00, 
				0xfd, 0x00, 
				0xf9, 0x00, 
				0x3b, 0x00, 
				0x93, 0x00, 
				0xd7, 0x00, 
				0xc7, 0x00, 
				0xef, 0x00
			};
			s_CheckmarkBitmap = CreateBitmap(8,10,1,1,win16check);
		}
	}
	return s_CheckmarkBitmap;
}
#endif