#include "StdAfx.h" #include "UIProperty.h" #include "UISkinLexer.h" #include "Parser.h" #include "UINodeProperty.h" #include "FileSystem.h" #include "MemFile.h" //#include "ServerWindow.h" cUIProperty::cUIProperty() { } cUIProperty::~cUIProperty() { Clear(); } void cUIProperty::Clear() { cNodePropertyMap::cIterator i = mNodePropertyMap.Begin(); cNodePropertyMap::cIterator end = mNodePropertyMap.End(); for( ; i != end; ++i ) { delete (cUINodeProperty*)(*i).mSecond; } mNodePropertyMap.Clear(); } bool cUIProperty::Load( const cString& pathName ) { 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 ); /// ¸ñ·Ï ÆÄÀÏÀ» Àд´Ù. "ex) uiPropertyList.txt" switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; case eTOKEN_PROPERTYFILES: if( LoadScripts( path, parser ) == false ) { return false; } break; default: assert( 0 && "invalid token" ); cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid token", MB_OK | MB_ICONERROR ); return false; } } return true; } /// ÁÖÀÇ»çÇ× : bool cUIProperty::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; } if( token.mType == eTOKEN_STR ) { /// path ¸¦ ºÙ¿©¼­ ¹Ø¿¡¼­ »õ·Î¿î ÆÄÀÏ ·ÎµùÇϵµ·Ï ÇÔ. cString pathName( path ); pathName += token; ///// °¢¼Ó¼ºÀ» °¢ ³ëµåµéÀÌ ÆÄ½ÌÇϰÔÇÔ if( LoadScript( pathName ) == false ) { assert( 0 && "failed to load script file" ); cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "failed to load script file", MB_OK | MB_ICONERROR ); return false; } } else { assert( 0 && "invalid keyword" ); cString msg; msg.Format("[%s] [Line:%d]", path.Cstr(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid keyword", MB_OK | MB_ICONERROR ); return false; } } /// °¢ ³ëµå ¼Ó¼ºµéÀÌ À¯È¿ÇÑÁö °Ë»ç cNodePropertyMap::cIterator i = mNodePropertyMap.Begin(); cNodePropertyMap::cIterator end = mNodePropertyMap.End(); for( ; i != end; ++i ) { if( ((cUINodeProperty*)(*i).mSecond)->IsValid() == false ) { assert( 0 && "found invalid node property" ); return false; } } return true; } /// ÁÖÀÇ»çÇ× : °¢ ¼Ó¼ºµéÀ» °¢ ³ëµåµéÀÌ ÆÄ½ÌÇϵµ·Ï ÇÔ /// Âü°í!!!!!! ¿©±â¼­ ¸Þ¸ð¸® ÇØÁ¦½Ã ¸¯ÀÌ ³ª´Â°æ¿ì´Â ¶È°°Àº À̸§ÀÇ /// ÇÁ·ÎÆÛƼ°¡ »ý¼ºµÇ¾ú±â ¶§¹®ÀÌ´Ù. /// GetNodeProperty À» ÇØ¼­ ÀÌ¹Ì Á¸ÀçÇÏ´Â À̸§ÀÌ ÀÖÀ¸¸é /// µÎ°³ÀÌ»ó Á¸ÀçÇÑ´Ù´Â ¶æÀÓ!! bool cUIProperty::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; } eUINodeType type = eUINODE_NULL; switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; /// window ¿Í µ¿ÀÏÇÑ tabsheet Ű¿öµå¸¦ µû·Î µÐ ÀÌÀ¯´Â /// »ç¿ëÀÚ°¡ ½ºÅ©¸³Æ®¿¡¼­ tabsheet ¸¦ ±¸º°Çϱ⠽±°ÔÇϱâÀ§Çؼ­ÀÓ. case eTOKEN_PROPERTY_TABSHEET: { type = eUINODE_TABSHEET; } break; case eTOKEN_PROPERTY_WINDOW: { /// ui À©µµ¿ì ¼Ó¼º type = eUINODE_WINDOW; } break; case eTOKEN_PROPERTY_CHECKBOX: { /// üũ¹Ú½º ¼Ó¼º type = eUINODE_CHECKBOX; } break; case eTOKEN_PROPERTY_LABEL: { /// ¶óº§ ¼Ó¼º type = eUINODE_LABEL; } break; case eTOKEN_PROPERTY_COMBOBOX: { /// ÄÞº¸¹Ú½º ¼Ó¼º type = eUINODE_COMBOBOX; } break; case eTOKEN_PROPERTY_PUSHBUTTON: { /// Ǫ½¬ ¹öư ¼Ó¼º type = eUINODE_PUSHBUTTON; } break; case eTOKEN_PROPERTY_BUTTON: { /// ¹öư ¼Ó¼º type = eUINODE_BUTTON; } break; case eTOKEN_PROPERTY_TABBUTTON: { /// Åǹöư ¼Ó¼º type = eUINODE_TABBUTTON; } break; case eTOKEN_PROPERTY_MULTIEDITBOX: { /// ¸ÖƼ ¿¡µðÆ®¹Ú½º ¼Ó¼º type = eUINODE_MULTIEDITBOX; } break; case eTOKEN_PROPERTY_EDITBOX: { /// ¿¡µðÆ®¹Ú½º ¼Ó¼º type = eUINODE_EDITBOX; } break; case eTOKEN_PROPERTY_LISTBOX: { /// ¸®½ºÆ®¹Ú½º ¼Ó¼º type = eUINODE_LISTBOX; } break; case eTOKEN_PROPERTY_SCROLLBAR: { /// ½ºÅ©·Ñ¹Ù ¼Ó¼º type = eUINODE_SCROLLBAR; } break; case eTOKEN_PROPERTY_BARBUTTON: { /// ¹Ù ¼Ó¼º type = eUINODE_BARBUTTON; } break; case eTOKEN_PROPERTY_SPINBOX: { /// ½ºÇɹڽº ¼Ó¼º type = eUINODE_SPINBOX; } break; case eTOKEN_PROPERTY_GAUGE: { /// °ÔÀÌÁö¹Ù ¼Ó¼º type = eUINODE_GAUGE; } break; case eTOKEN_PROPERTY_GAUGETB: { type = eUINODE_GAUGETB; } break; case eTOKEN_PROPERTY_DOUBLEGAUGE: { type = eUINODE_DOUBLEGAUGE; } break; case eTOKEN_PROPERTY_TEXTBOX: { /// ÅØ½ºÆ®¹Ú½º ¼Ó¼º type = eUINODE_TEXTBOX; } break; case eTOKEN_PROPERTY_TABWINDOW: { /// ÅÇÀ©µµ¿ì ¼Ó¼º type = eUINODE_TABWINDOW; } break; case eTOKEN_PROPERTY_NUMBEREDIT: { /// ¿¡µðÆ®¹Ú½º ¼Ó¼º type = eUINODE_NUMBEREDIT; } break; case eTOKEN_PROPERTY_RADIOBUTTON: { /// ¶óµð¿À¹öư ¼Ó¼º type = eUINODE_RADIOBUTTON; } break; case eTOKEN_PROPERTY_OPTIONGAUGE: { /// ¿É¼Ç°ÔÀÌÁö ¼Ó¼º type = eUINODE_OPTIONGAUGE; } break; case eTOKEN_PROPERTY_LISTFOLDERBOX: { /// Æú´õ ¸®½ºÆ®¹Ú½º ¼Ó¼º type = eUINODE_LISTFOLDERBOX; } break; default: assert( 0 && "invalid token" ); cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid token", MB_OK | MB_ICONERROR ); return false; } /// »ý¼º cUINodeProperty* p = new cUINodeProperty( name, type ); /// ·Îµù if( p->Load( parser ) == false ) { delete p; return false; } /// ³ëµå ¼Ó¼º ¸Ê¿¡ Ãß°¡ if( mNodePropertyMap.Insert( name, p ) == false ) { assert( 0 && "failed to insert ui node property, maybe already exist" ); cString msg; msg.Format("[%s] [Line:%d] [prop:%s]", pathName.Cstr(), token.mLine, name.Cstr() ); MessageBoxA( NULL, msg.Cstr(), "failed to insert ui node property, maybe already exist", MB_OK | MB_ICONERROR ); return false; } } return true; } /// ÁÖÀÇ»çÇ× : cUINodeProperty* cUIProperty::GetNodeProperty( const cString& name ) const { cNodePropertyMap::cConstIterator i = mNodePropertyMap.Find( name ); if( i == mNodePropertyMap.End() ) { //assert( 0 && "failed to find ui node property" ); return 0; } return (cUINodeProperty*)(i->mSecond); }