2024-12-21 10:04:04 +08:00
# include "StdAfx.h"
# include "EtUIHtmlTextBox.h"
# ifdef _DEBUG
# define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
# endif
CEtUIHtmlTextBox : : CEtUIHtmlTextBox ( CEtUIDialog * pParent )
: CEtUITextBox ( pParent )
, m_dwTextColor ( textcolor : : WHITE )
, m_dwDefaultTextColor ( textcolor : : WHITE )
{
m_Property . UIType = UI_CONTROL_HTMLTEXTBOX ;
m_htmlReader . setEventHandler ( this ) ;
}
CEtUIHtmlTextBox : : ~ CEtUIHtmlTextBox ( void )
{
}
void CEtUIHtmlTextBox : : BeginParse ( DWORD dwAppData , bool & bAbort )
{
ClearText ( ) ;
bAbort = false ;
}
void CEtUIHtmlTextBox : : StartTag ( CLiteHTMLTag * pTag , DWORD dwAppData , bool & bAbort )
{
if ( pTag )
{
static CStringW strStartTag ;
strStartTag = pTag - > getTagName ( ) ;
if ( strStartTag . CompareNoCase ( L " font " ) = = 0 )
{
CLiteHTMLAttributes * pAtt = const_cast < CLiteHTMLAttributes * > ( pTag - > getAttributes ( ) ) ;
if ( pAtt )
{
for ( int i = 0 ; i < pAtt - > getCount ( ) ; i + + )
{
CLiteHTMLElemAttr & pElemAttr = pAtt - > getAttribute ( i ) ;
if ( pElemAttr . isColorValue ( ) )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <EFBFBD> <F0B8A3B0> <EFBFBD> <EFBFBD> <EFBFBD> html <20> ÷<EFBFBD> <C3B7> <EFBFBD> r <20> <> b <20> <> <20> ݴ<EFBFBD> <DDB4> ΰ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> ..
COLORREF clr = pElemAttr . getColorValue ( ) ;
BYTE b = GetRValue ( clr ) ;
BYTE g = GetGValue ( clr ) ;
BYTE r = GetBValue ( clr ) ;
m_dwTextColor = D3DCOLOR_XRGB ( r , g , b ) ;
break ;
}
}
}
}
else if ( strStartTag . CompareNoCase ( L " br " ) = = 0 )
{
AddLine ( ) ;
}
else if ( strStartTag . CompareNoCase ( L " p " ) = = 0 )
{
AddLine ( ) ;
}
else if ( strStartTag . CompareNoCase ( L " div " ) = = 0 )
{
CLiteHTMLAttributes * pAtt = const_cast < CLiteHTMLAttributes * > ( pTag - > getAttributes ( ) ) ;
if ( pAtt )
{
for ( int i = 0 ; i < pAtt - > getCount ( ) ; + + i )
{
// todo : vertical center align
CLiteHTMLElemAttr & pElemAttr = pAtt - > getAttribute ( i ) ;
if ( pElemAttr . getValue ( ) . CompareNoCase ( L " center " ) = = 0 )
m_Property . TextBoxProperty . AllignHori = AT_HORI_CENTER ;
}
}
}
else if ( strStartTag . CompareNoCase ( L " img " ) = = 0 ) {
CLiteHTMLAttributes * pAtt = const_cast < CLiteHTMLAttributes * > ( pTag - > getAttributes ( ) ) ;
if ( pAtt )
{
int nWidth = 0 ;
int nHeight = 0 ;
std : : wstring wszImageName ;
for ( int i = 0 ; i < pAtt - > getCount ( ) ; + + i )
{
// todo : vertical center align
CLiteHTMLElemAttr & pElemAttr = pAtt - > getAttribute ( i ) ;
if ( pElemAttr . getName ( ) . CompareNoCase ( L " src " ) = = 0 ) {
wszImageName = pElemAttr . getValue ( ) . GetBuffer ( ) ;
}
else if ( pElemAttr . getName ( ) . CompareNoCase ( L " width " ) = = 0 ) {
nWidth = _wtoi ( pElemAttr . getValue ( ) . GetBuffer ( ) ) ;
}
else if ( pElemAttr . getName ( ) . CompareNoCase ( L " height " ) = = 0 ) {
nHeight = _wtoi ( pElemAttr . getValue ( ) . GetBuffer ( ) ) ;
}
}
if ( ! wszImageName . empty ( ) ) AddImage ( ( WCHAR * ) wszImageName . c_str ( ) , nWidth , nHeight ) ;
}
}
}
bAbort = false ;
}
void CEtUIHtmlTextBox : : EndTag ( CLiteHTMLTag * pTag , DWORD dwAppData , bool & bAbort )
{
if ( pTag )
{
static CStringW strEndTag ;
strEndTag = pTag - > getTagName ( ) ;
if ( strEndTag . CompareNoCase ( L " font " ) = = 0 )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ۾<EFBFBD> <DBBE> <EFBFBD> <EFBFBD> <EFBFBD> <20> ⺻<EFBFBD> <E2BABB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ο <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǿ<EFBFBD> <C7BE> <EFBFBD> .
// <20> ٸ<EFBFBD> <20> <> <EFBFBD> ̾<EFBFBD> <CCBE> α <CEB1> <D7BF> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> Ʈ<EFBFBD> <C6AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϰ<EFBFBD> <CFB0> ־ <20> ̷<EFBFBD> <CCB7> <EFBFBD> <20> ⺻ <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ü<EFBFBD> <C3BC> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ű<EFBFBD> <C5B0> <20> ȵȴ<C8B5> .
//m_dwTextColor = textcolor::WHITE;
//m_dwTextColor = textcolor::NPC_SPEECH;
m_dwTextColor = m_dwDefaultTextColor ;
}
else if ( strEndTag . CompareNoCase ( L " p " ) = = 0 )
{
AddLine ( ) ;
}
else if ( strEndTag . CompareNoCase ( L " div " ) = = 0 )
{
m_Property . TextBoxProperty . AllignHori = AT_HORI_NONE ;
}
}
bAbort = false ;
}
void CEtUIHtmlTextBox : : Characters ( const CStringW & rText , DWORD dwAppData , bool & bAbort )
{
// Npc<70> <63> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ´ <EFBFBD> .
// <20> <> <EFBFBD> 簡 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ѿ<D1BE> <EEB0A5> <EFBFBD> <EFBFBD> ó<> <C3B3> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ⼭ <20> ϸ<EFBFBD> <20> <> <20> <> .
AppendText ( rText , m_dwTextColor ) ;
bAbort = false ;
}
void CEtUIHtmlTextBox : : Comment ( const CStringW & rComment , DWORD dwAppData , bool & bAbort )
{
bAbort = false ;
}
void CEtUIHtmlTextBox : : EndParse ( DWORD dwAppData , bool bIsAborted )
{
}
bool CEtUIHtmlTextBox : : ReadHtmlString ( LPCWSTR lpszString )
{
if ( m_htmlReader . Read ( lpszString ) = = 0U )
{
return false ;
}
if ( m_ScrollBar . IsShowThumb ( ) )
{
m_ScrollBar . Show ( true ) ;
}
else
{
m_ScrollBar . Show ( false ) ;
}
return true ;
}
bool CEtUIHtmlTextBox : : ReadHtmlFile ( LPCWSTR filename )
{
if ( m_htmlReader . ReadFile ( filename ) = = 0U )
{
return false ;
}
return true ;
}
bool CEtUIHtmlTextBox : : ReadHtmlFile ( LPCSTR filename )
{
if ( m_htmlReader . ReadFile ( filename ) = = 0U )
{
return false ;
}
return true ;
}
bool CEtUIHtmlTextBox : : ReadHtmlStream ( CStream * pStream )
{
int nSize = pStream - > Size ( ) + 1 ;
char * szBuffer = new char [ nSize ] ;
WCHAR * wszBuffer = new WCHAR [ nSize ] ;
memset ( szBuffer , 0 , nSize ) ;
pStream - > Read ( ( void * ) szBuffer , pStream - > Size ( ) ) ;
MultiByteToWideChar ( CP_UTF8 , 0 , szBuffer + 3 , - 1 , wszBuffer , nSize ) ;
bool bResult = ( m_htmlReader . Read ( wszBuffer ) = = 0 ) ? false : true ;
SAFE_DELETEA ( wszBuffer ) ;
SAFE_DELETEA ( szBuffer ) ;
return bResult ;
}
int CEtUIHtmlTextBox : : GetScrollBarTemplate ( )
{
return m_Property . HtmlTextBoxProperty . nScrollBarTemplate ;
}
void CEtUIHtmlTextBox : : SetScrollBarTemplate ( int nIndex )
{
m_Property . HtmlTextBoxProperty . nScrollBarTemplate = nIndex ;
}
void CEtUIHtmlTextBox : : RenderLine ( float fElapsedTime , CLine * sLine , bool bRollOver )
{
static float fGapX = - 0.002f ;
static float fGapY = m_Property . HtmlTextBoxProperty . fLineSpace - 0.0013f ;
SUIElement * pBaseElement = GetElement ( 2 ) ;
if ( ! bRollOver & & pBaseElement )
{
SUICoord sLineCoord ;
sLineCoord = sLine - > m_uiCoord ;
sLineCoord . fX + = fGapX ;
sLineCoord . fY + = fGapY ;
sLineCoord . fWidth = m_Property . UICoord . fWidth - m_Property . TextBoxProperty . fScrollBarSize ;
if ( m_bExistTemplateTexture )
m_pParent - > DrawSprite ( m_Template . m_hTemplateTexture , pBaseElement - > TemplateUVCoord , 0xffffffff , sLineCoord ) ;
else
m_pParent - > DrawSprite ( pBaseElement - > UVCoord , 0xffffffff , sLineCoord ) ;
//m_pParent->DrawRect( sLineCoord, textcolor::ORANGE );
}
// <20> <> <EFBFBD> ÷ѿ<C3B7> <D1BF> <EFBFBD> <20> ̹<EFBFBD> <CCB9> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
SUIElement * pElement = GetElement ( 1 ) ;
if ( bRollOver & & pElement )
{
SUICoord sLineCoord ;
sLineCoord = sLine - > m_uiCoord ;
sLineCoord . fX + = fGapX ;
sLineCoord . fY + = fGapY ;
sLineCoord . fWidth = m_Property . UICoord . fWidth - m_Property . TextBoxProperty . fScrollBarSize ;
if ( m_bExistTemplateTexture )
m_pParent - > DrawSprite ( m_Template . m_hTemplateTexture , pElement - > TemplateUVCoord , 0xffffffff , sLineCoord ) ;
else
m_pParent - > DrawSprite ( pElement - > UVCoord , 0xffffffff , sLineCoord ) ;
//m_pParent->DrawRect( sLineCoord, textcolor::ORANGE );
}
switch ( sLine - > GetLineType ( ) ) {
case CLine : : Line :
{
VECWORD & vecWord = sLine - > m_vecWord ;
int nWordSize = ( int ) vecWord . size ( ) ;
for ( int i = 0 ; i < nWordSize ; i + + )
{
RenderWord ( fElapsedTime , vecWord [ i ] , bRollOver ) ;
}
}
break ;
case CLine : : Image :
{
CImageLine * pImageLine = ( CImageLine * ) sLine ;
EtTextureHandle hTexture = pImageLine - > GetTexture ( ) ;
if ( ! hTexture ) {
break ;
}
SUIElement * pElement = GetElement ( 0 ) ;
if ( ! pElement ) return ;
SUICoord uiRenderCoord , uiResult ;
uiRenderCoord = pImageLine - > m_uiCoord ;
uiRenderCoord . fX + = pElement - > fFontHoriOffset ;
uiRenderCoord . fY + = pElement - > fFontVertOffset ;
// uiResult = m_pParent->DlgCoordToScreenCoord( uiRenderCoord );
// <20> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> uv <20> Ѿ<D1BE> °<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ̰<EFBFBD> uv<75> <76> <EFBFBD> 缭 <20> <> <EFBFBD> <EFBFBD> .
SUICoord uiUVCoord = pImageLine - > GetTextureUV ( ) ;
if ( uiUVCoord . fY + uiUVCoord . fHeight > 1.f ) {
float fOrigHeight = uiUVCoord . fHeight ;
uiUVCoord . fHeight = 1.f - uiUVCoord . fY ;
uiRenderCoord . fHeight = uiRenderCoord . fHeight * uiUVCoord . fHeight / fOrigHeight ;
}
m_pParent - > DrawSprite ( hTexture , pImageLine - > GetTextureUV ( ) , 0xFFFFFFFF , uiRenderCoord , 0.f , m_fZValue ) ;
// CEtSprite::GetInstance().DrawSprite( (EtTexture*)hTexture->GetTexturePtr(), hTexture->Width(), hTexture->Height(), pImageLine->GetTextureUV(), 0xFFFFFFFF, uiResult, 0.f );
}
break ;
}
}