#include "StdAfx.h" #include "UISkin.h" #include "UISkinLexer.h" #include "Parser.h" /// #include "Button.h" #include "CheckBox.h" #include "ComboBox.h" #include "EditBox.h" #include "Gauge.h" #include "Icon.h" #include "Label.h" #include "ListBox.h" #include "MsgBox.h" #include "OptionGauge.h" #include "RadioButton.h" #include "ScrollBar.h" #include "SpinBox.h" #include "UIWindow.h" #include "TextBox.h" #include "TabWindow.h" #include "ListFolderBox.h" #include "ResourceManager.h" #include "TargaImage.h" #include "BitArray.h" #include "Application.h" cUISkin::cUISkin() { } cUISkin::~cUISkin() { Clear(); } /// ÁÖÀÇ»çÇ× : void cUISkin::Clear() { /// ÅØ½ºÃ³ ¸ÊÀ» Áö¿ò mTextureMap.Clear(); /// ºñÆ® ¹è¿­ ¸ÊÀ» Áö¿ò { cBitArrayMap::cIterator i = mAlphaBitArrayMap.Begin(); cBitArrayMap::cIterator iend = mAlphaBitArrayMap.End(); for( ; i != iend; ++i ) { delete (cBitArray*)i->mSecond; } mAlphaBitArrayMap.Clear(); } /// ³ëµå ½ºÅ² ¸ÊÀ» Áö¿ò { cNodeSkinMap::cIterator i = mNodeSkinMap.Begin(); cNodeSkinMap::cIterator iend = mNodeSkinMap.End(); for( ; i != iend; ++i ) { delete (cUINodeSkin*)i->mSecond; } mNodeSkinMap.Clear(); } } /// ÁÖÀÇ»çÇ× : bool cUISkin::Load( const cString& pathName ) { /// Áö¿ì±â Clear(); /// ÆÄÀÏ ¿­±â cFileLoader loader; if( loader.Open( pathName, true ) == false ) { return false; } /// ½ºÅ² ÆÄÀÏÀÇ °æ·Î ÃßÃâ cString path; ::GetFilePath( &path, pathName ); /// ·º¼­¿¡ ¹äÁÖ°í ÆÄ½Ì cToken token; cUISkinLexer lexer( loader.GetBufferPtr(), loader.GetSize() ); cParser parser( &lexer, pathName ); while( lexer.IsEnd() == false ) { lexer.GetNextToken( &token ); switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; case eTOKEN_IMAGES: { /// À̹ÌÁö ÆÄÀϵéÀ» ·Îµù if( LoadImages( path, parser ) == false ) { assert( 0 && "fail to load imagefile" ); return false; } } break; case eTOKEN_SKINFILES: { /// ½ºÅ©¸³Æ® ÆÄÀϵéÀ» ·Îµù if( LoadScripts( path, parser ) == false ) { assert( 0 && "fail to load script" ); return false; } } break; default: assert( 0 && "invalid token" ); return false; } } return true; } /// ÁÖÀÇ»çÇ× : bool cUISkin::LoadImages( const cString& , cParser& parser ) { if( parser.ExpectTokenString( "{" ) == false ) { return false; } cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) { /// ºí·Ï Å»Ãâ ^^ break; } /// ÅØ½ºÃ³ ·Îµù unsigned int id = token.ToInt(); parser.ParseString( &token ); cString pathName; pathName.Format( "./language/%s/%s", cApplication::mLangaugeFolder.Cstr(), token.Cstr() ); NiTexture* p = RESOURCEMAN->LoadTexture( pathName, false ); if( p == 0 ) { assert( 0 && "failed to load texture" ); return false; } /// ÅØ½ºÃ³ ¸Ê¿¡ Ãß°¡ mTextureMap.Insert( id, p ); /// ÅØ½ºÃ³¿¡ ¾ËÆÄ°¡ ÀÖ´Â °æ¿ì ¾ËÆÄ ºñÆ® ¹è¿­À» »ý¼º ¹× ·Îµù cTargaImage tgaImage; if( tgaImage.Load( pathName ) == true && tgaImage.GetBytesPerPixel() == 4 ) { cBitArray* bitArray = new cBitArray( tgaImage.GetWidth() * tgaImage.GetHeight() ); bitArray->mWidth = tgaImage.GetWidth(); bitArray->mHeight = tgaImage.GetHeight(); unsigned char alpha = 0; for( int y = tgaImage.GetHeight()-1, i = 0; y >= 0; --y ) { for( int x = 0, xend = tgaImage.GetWidth(); x < xend; ++x, ++i ) { tgaImage.GetPixel( 0, 0, 0, &alpha, (unsigned int)x, (unsigned int)y ); bitArray->Set( i, alpha > 0 ); } } mAlphaBitArrayMap.Insert( id, bitArray ); } } return true; } /// ÁÖÀÇ»çÇ× : bool cUISkin::LoadScripts( const cString& path, cParser& parser ) { if( parser.ExpectTokenString( "{" ) == false ) { return false; } cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) { /// ºí·Ï Å»Ãâ ^^ break; } switch( token.mType ) { case eTOKEN_STR: { cString pathName( path ); pathName += token; if( LoadScript( pathName ) == false ) { assert( 0 && "failed to load skin script" ); return false; } } break; default: assert( 0 && "invalid token" ); return false; } } /// °¢ ³ëµå ½ºÅ²¿¡ ´ëÇØ ÀûÇÕ¼º °Ë»ç cNodeSkinMap::cIterator i = mNodeSkinMap.Begin(); cNodeSkinMap::cIterator end = mNodeSkinMap.End(); for( ; i != end; ++i ) { if( ((cUINodeSkin*)(*i).mSecond)->IsValid() == false ) { assert( 0 && "found invalid node skin" ); return false; } } return true; } /// ÁÖÀÇ»çÇ× : /// Âü°í!!!!!! ¿©±â¼­ ¸Þ¸ð¸® ÇØÁ¦½Ã ¸¯ÀÌ ³ª´Â°æ¿ì´Â ¶È°°Àº À̸§ÀÇ /// ½ºÅ²ÀÌ »ý¼ºµÇ¾ú±â ¶§¹®ÀÌ´Ù. /// GetNodeSkin À» ÇØ¼­ ÀÌ¹Ì Á¸ÀçÇÏ´Â À̸§ÀÌ ÀÖÀ¸¸é /// µÎ°³ÀÌ»ó Á¸ÀçÇÑ´Ù´Â ¶æÀÓ!! bool cUISkin::LoadScript( const cString& pathName ) { /// ÆÄÀÏ ·Îµù cFileLoader loader; if( loader.Open( pathName, true ) == false ) { return false; } /// ·º¼­¿¡ ¹äÁÖ°í ÆÄ½Ì cToken token; cUISkinLexer lexer( loader.GetBufferPtr(), loader.GetSize() ); cParser parser( &lexer, pathName ); while( lexer.IsEnd() == false ) { lexer.GetNextToken( &token ); cString name; if( parser.ParseString( &name ) == false ) return false; cUINodeSkin* p = 0; switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; case eTOKEN_TABSHEET: case eTOKEN_WINDOW: { /// À©µµ¿ì ½ºÅ² »ý¼º p = cUIWindowSkin::Create( name.Cstr() ); } break; case eTOKEN_BARBUTTON: { p = new cButtonSkin( eUINODE_BARBUTTON ); } break; case eTOKEN_PUSHBUTTON: { p = new cButtonSkin( eUINODE_PUSHBUTTON ); } break; case eTOKEN_BUTTON: { p = new cButtonSkin( eUINODE_BUTTON ); } break; case eTOKEN_TABBUTTON: { /// ¹öư ½ºÅ² »ý¼º p = new cButtonSkin( eUINODE_TABBUTTON ); } break; case eTOKEN_CHECKBOX: { /// üũ ¹Ú½º ½ºÅ² »ý¼º p = new cCheckBoxSkin; } break; case eTOKEN_LABEL: { /// ¶óº§ ½ºÅ² »ý¼º p = new cLabelSkin; } break; case eTOKEN_MULTIEDITBOX: { p = new cEditBoxSkin( eUINODE_MULTIEDITBOX ); } break; case eTOKEN_EDITBOX: { /// ¿¡µðÆ® ½ºÅ² »ý¼º p = new cEditBoxSkin; } break; case eTOKEN_LISTBOX: { /// ¸®½ºÆ® ½ºÅ² »ý¼º p = new cListBoxSkin; } break; case eTOKEN_LISTFOLDERBOX: { /// ¸®½ºÆ® ½ºÅ² »ý¼º p = new cListFolderBoxSkin; } break; case eTOKEN_SCROLLBAR: { /// ½ºÅ©·Ñ¹Ù ½ºÅ² »ý¼º p = new cScrollBarSkin; } break; case eTOKEN_COMBOBOX: { /// ÄÞº¸¹Ú½º ½ºÅ² »ý¼º p = new cComboBoxSkin; } break; case eTOKEN_GAUGE: { p = new cGaugeSkin; } break; case eTOKEN_GAUGETB: { p = new cGaugeSkin( eUINODE_GAUGETB ); } break; case eTOKEN_DOUBLEGAUGE: { /// °ÔÀÌÁö¹Ù ½ºÅ² »ý¼º p = new cGaugeSkin( eUINODE_DOUBLEGAUGE ); } break; case eTOKEN_TEXTBOX: { /// ÅØ½ºÆ®¹Ú½º ½ºÅ² »ý¼º p = new cTextBoxSkin; } break; case eTOKEN_TABWINDOW: { /// ÅÇÀ©µµ¿ì ½ºÅ² »ý¼º p = new cTabWindowSkin; } break; case eTOKEN_SPINBOX: { /// ½ºÇÉÄÁÆ®·Ñ ½ºÅ² »ý¼º p = new cSpinBoxSkin; } break; case eTOKEN_MESSAGEBOX: { /// ¸Þ¼¼Áö ¹Ú½º ½ºÅ² »ý¼º p = new cMessageBoxSkin; } break; case eTOKEN_ICON: { /// ¾ÆÀÌÄÜ ½ºÅ² »ý¼º p = new cIconSkin; } break; case eTOKEN_RADIOBUTTON: { /// ¶óµð¿À ¹öư ½ºÅ² »ý¼º p = new cRadioButtonSkin; } break; case eTOKEN_OPTIONGAUGE: { /// ¿É¼Ç °ÔÀÌÁö ½ºÅ² »ý¼º p = new cOptionGaugeSkin; } break; default: assert( 0 && "invalid token" ); return false; } /// ·Îµù if( p->Load( parser ) == false ) { delete p; return false; } /// ³ëµå ½ºÅ² ¸Ê¿¡ Ãß°¡ if( mNodeSkinMap.Insert( name, p ) == false ) { assert( 0 && "failed to insert ui node skin, maybe already exist" ); return false; } } return true; } /// bool cUISkin::Reload( const cString& pathName ) { /// ÅØ½ºÃ³ ¸ÊÀ» Áö¿ò mTextureMap.Clear(); /// ÆÄÀÏ ¿­±â cFileLoader loader; if( loader.Open( pathName, true ) == false ) { return false; } /// ½ºÅ² ÆÄÀÏÀÇ °æ·Î ÃßÃâ cString path; ::GetFilePath( &path, pathName ); /// ·º¼­¿¡ ¹äÁÖ°í ÆÄ½Ì cToken token; cUISkinLexer lexer( loader.GetBufferPtr(), loader.GetSize() ); cParser parser( &lexer, pathName ); while( lexer.IsEnd() == false ) { lexer.GetNextToken( &token ); switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; case eTOKEN_IMAGES: { /// À̹ÌÁö ÆÄÀϵéÀ» ·Îµù if( LoadImages( path, parser ) == false ) { assert( 0 && "fail to load imagefile" ); return false; } } break; case eTOKEN_SKINFILES: { /// ½ºÅ©¸³Æ® ÆÄÀϵéÀ» ·Îµù if( ReloadScripts( path, parser ) == false ) { assert( 0 && "fail to load script" ); return false; } } break; default: assert( 0 && "invalid token" ); return false; } } return true; } /// bool cUISkin::ReloadScripts( const cString& path, cParser& parser ) { if( parser.ExpectTokenString( "{" ) == false ) { return false; } cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) break; switch( token.mType ) { case eTOKEN_STR: { cString pathName( path ); pathName += token; if( ReloadScript( pathName ) == false ) { assert( 0 && "failed to Reload skin script" ); return false; } } break; default: assert( 0 && "invalid token" ); return false; } } /// °¢ ³ëµå ½ºÅ²¿¡ ´ëÇØ ÀûÇÕ¼º °Ë»ç cNodeSkinMap::cIterator i = mNodeSkinMap.Begin(); cNodeSkinMap::cIterator end = mNodeSkinMap.End(); for( ; i != end; ++i ) { if( ((cUINodeSkin*)(*i).mSecond)->IsValid() == false ) { assert( 0 && "found invalid node skin" ); return false; } } return true; } /// ½ºÅ©¸³Æ® ¸®·Îµå ±â´É ( ½ºÅ²ÀÇ µ¥ÀÌÅ͸¸ ¹Ù²ï´Ù ) bool cUISkin::ReloadScript( const cString& pathName ) { /// ÆÄÀÏ ·Îµù cFileLoader loader; if( loader.Open( pathName, true ) == false ) { return false; } /// ·º¼­¿¡ ¹äÁÖ°í ÆÄ½Ì cToken token; cUISkinLexer lexer( loader.GetBufferPtr(), loader.GetSize() ); cParser parser( &lexer, pathName ); while( lexer.IsEnd() == false ) { lexer.GetNextToken( &token ); cString name; if( parser.ParseString( &name ) == false ) return false; if( token.mType == eTOKEN_ERROR ) return false; if( token.mType == eTOKEN_NULL ) continue; cUINodeSkin* p = GetNodeSkin( name ); if( p == 0 ) { assert( 0 ); return false; } /// ·Îµù if( p->Load( parser ) == false ) { assert( 0 && "failed to update skin script" ); return false; } } return true; }