#include "StdAfx.h" #include "PropertyGridCreator.h" #include "XTCustomPropertyGridItemFile.h" #include "XTCustomPropertyGridItemVector.h" #include "XTCustomPropertyGridItemVector4Color.h" #include "XTCustomPropertyGridItemNumberSlider.h" #include "XTCustomPropertyGridItemColor.h" #include "XTCustomPropertyGridItemNumber.h" #include "XTCustomPropertyGridItem.h" #include "XTCustomPropertyGridItemNumber.h" CPropertyGridImp::CPropertyGridImp() { m_pDefineList = NULL; m_bSelfAlloc = false; m_ppVecVariable = NULL; m_bUpdateItem = false; } CPropertyGridImp::CPropertyGridImp( PropertyGridBaseDefine *pDefineList ) { m_pDefineList = pDefineList; m_ppVecVariable = NULL; m_bSelfAlloc = true; m_bUpdateItem = false; } CPropertyGridImp::CPropertyGridImp( std::vector *pVecList ) { m_pDefineList = NULL; m_ppVecVariable = pVecList; m_bSelfAlloc = false; m_bUpdateItem = false; } CPropertyGridImp::~CPropertyGridImp() { if( m_bSelfAlloc == true ) { SAFE_DELETE_PVEC( m_pVecVariable ); } else { SAFE_DELETE_VEC( m_pVecVariable ); } } CXTPPropertyGridItem *CPropertyGridImp::CreateItem( CUnionValueProperty *pVariable ) { CXTPPropertyGridItem *pSubItem = NULL; switch( pVariable->GetType() ) { case CUnionValueProperty::Integer: { std::vector szVecList; CString szStr; for( int k=0; ; k++ ) { const char *pPtr = _GetSubStrByCount( k, (char*)pVariable->GetSubDescription(), '|' ); if( pPtr == NULL ) break; szStr.Format( "%s", pPtr ); szVecList.push_back( szStr ); } if( szVecList.size() == 4 ) pSubItem = new CXTCustomPropertyGridItemNumberSlider( pVariable->GetDescription(), pVariable->m_nValue, (long*)&pVariable->m_nValue, CSize( atoi(szVecList[1]), atoi(szVecList[2]) ), atoi(szVecList[3]) ); else pSubItem = new CXTCustomPropertyGridItemNumber( pVariable->GetDescription(), pVariable->m_nValue, (long*)&pVariable->m_nValue ); } break; case CUnionValueProperty::Float: { std::vector szVecList; CString szStr; for( int k=0; ; k++ ) { const char *pPtr = _GetSubStrByCount( k, (char*)pVariable->GetSubDescription(), '|' ); if( pPtr == NULL ) break; szStr.Format( "%s", pPtr ); szVecList.push_back( szStr ); } if( szVecList.size() == 4 ) pSubItem = new CXTCustomPropertyGridItemFloatSlider( pVariable->GetDescription(), pVariable->m_fValue, CString("%0.3f"), (float*)&pVariable->m_fValue, (float)atof(szVecList[1]),(float)atof(szVecList[2]), (float)atof(szVecList[3]) ); else pSubItem = new CXTPPropertyGridItemFloat( pVariable->GetDescription(), pVariable->m_fValue, CString("%0.3f"), (float*)&pVariable->m_fValue ); } break; case CUnionValueProperty::Char: case CUnionValueProperty::String: pSubItem = new CXTCustomPropertyGridItem( pVariable->GetDescription(), *pVariable->GetBindStr(), pVariable->GetBindStr() ); break; case CUnionValueProperty::Vector2: { std::vector szVecList; CString szStr; for( int k=0; ; k++ ) { const char *pPtr = _GetSubStrByCount( k, (char*)pVariable->GetSubDescription(), '|' ); if( pPtr == NULL ) break; szStr.Format( "%s", pPtr ); szVecList.push_back( szStr ); } if( szVecList.size() == 4 ) pSubItem = new CXTCustomPropertyGridItemVector2DRange( pVariable->GetDescription(), *pVariable->m_pVec2Value, pVariable->m_pVec2Value, (float)atof(szVecList[1]), (float)atof(szVecList[2]), (float)atof(szVecList[3]) ); else pSubItem = new CXTCustomPropertyGridItemVector2( pVariable->GetDescription(), *pVariable->m_pVec2Value, pVariable->m_pVec2Value ); } break; case CUnionValueProperty::Vector3: pSubItem = new CXTCustomPropertyGridItemVector3( pVariable->GetDescription(), *pVariable->m_pVec3Value, pVariable->m_pVec3Value ); if( strstr( pVariable->GetSubDescription(), "!" ) != NULL ) { ((CXTCustomPropertyGridItemVector3*)pSubItem)->SetNormalized( true ); } break; case CUnionValueProperty::Vector4: pSubItem = new CXTCustomPropertyGridItemVector4( pVariable->GetDescription(), *pVariable->m_pVec4Value, pVariable->m_pVec4Value ); break; case CUnionValueProperty::Vector4Color: pSubItem = new CXTCustomPropertyGridItemVector4Color( pVariable->GetDescription(), *pVariable->m_pVec4Value, pVariable->m_pVec4Value ); break; case CUnionValueProperty::Boolean: pSubItem = new CXTPPropertyGridItemBool( pVariable->GetDescription(), (BOOL)pVariable->m_bValue, (BOOL*)&pVariable->m_bValue ); break; case CUnionValueProperty::Color: pSubItem = new CXTCustomPropertyGridItemColor( pVariable->GetDescription(), (COLORREF)pVariable->m_nValue, (COLORREF*)&pVariable->m_nValue ); break; case CUnionValueProperty::Integer_Combo: { const char *szString = _GetSubStrByCount( 1 + pVariable->m_nValue, (char*)pVariable->GetSubDescription() ); pSubItem = new CXTPPropertyGridItem( pVariable->GetDescription(), szString, pVariable->GetBindStr() ); CXTPPropertyGridItemConstraints* pList = pSubItem->GetConstraints(); for( int k=0; ; k++ ) { const char *szString = _GetSubStrByCount( k, (char*)pVariable->GetSubDescription(), '|' ); if( szString == NULL ) break; if( k == 0 ) continue; pList->AddConstraint( szString ); } pList->SetCurrent( pVariable->m_nValue ); pSubItem->SetFlags( xtpGridItemHasComboButton ); } break; case CUnionValueProperty::String_FileOpen: { CString szDesc, szExt, szFileDesc; for( int k=0; ; k++ ) { const char *szString = _GetSubStrByCount( k, (char*)pVariable->GetSubDescription(), '|' ); if( szString == NULL ) break; switch( k ) { case 0: szDesc = szString; break; case 1: szFileDesc = szString; break; case 2: szExt = szString; break; } } pSubItem = new CXTCustomPropertyGridItemFile( pVariable->GetDescription(), *pVariable->GetBindStr(), pVariable->GetBindStr() ); ((CXTCustomPropertyGridItemFile*)pSubItem)->SetExt( szExt, szFileDesc ); ((CXTCustomPropertyGridItemFile*)pSubItem)->SetInitDirectory( m_szInitDirectory ); } break; } pVariable->SetXTPropItem( pSubItem ); return pSubItem; } CUnionValueProperty *CPropertyGridImp::CreateVariable( PropertyGridBaseDefine *pDefine ) { CUnionValueProperty *pVariable = NULL; pVariable = new CUnionValueProperty( pDefine->Type ); pVariable->SetDescription( pDefine->szStr ); pVariable->SetSubDescription( pDefine->szDescription ); pVariable->SetDefaultEnable( pDefine->bEnable ); return pVariable; } void CPropertyGridImp::ResetPropertyGrid() { m_pVecItem.clear(); m_PropertyGrid.ResetContent(); m_PropertyGrid.ShowHelp( FALSE ); m_PropertyGrid.ShowHelp( TRUE ); if( m_bSelfAlloc == true ) { SAFE_DELETE_PVEC( m_pVecVariable ); } else { SAFE_DELETE_VEC( m_pVecVariable ); } } bool CPropertyGridImp::RefreshPropertyGrid( PropertyGridBaseDefine *pDefineList, int nCount ) { ResetPropertyGrid(); m_bSelfAlloc = true; if( pDefineList ) { m_pDefineList = pDefineList; } std::vector vecCategory; if( nCount == -1 ) nCount = 65535; for( int i=0; iGetSubDescription(), '|' ); pSubItem->SetReadOnly( !pVariable->IsDefaultEnable() ); pSubItem->SetDescription( pStr ); pCategory->AddChildItem( pSubItem ); m_pVecItem.push_back( pSubItem ); m_pVecVariable.push_back( pVariable ); if( m_pDefineList[i].bCustomDialog ) { pSubItem->SetFlags( pSubItem->GetFlags() | xtpGridItemHasExpandButton ); } } OnSetValue( pVariable, i ); } for( DWORD i=0; iExpand(); } return true; } bool CPropertyGridImp::RefreshPropertyGrid( std::vector *pVecList ) { ResetPropertyGrid(); m_bSelfAlloc = false; if( pVecList ) { m_ppVecVariable = pVecList; } std::vector vecCategory; for( DWORD i=0; isize(); i++ ) { CUnionValueProperty *pVariable = (*m_ppVecVariable)[i]; // ÀÏ´Ü Ä«Å×°í¸®¸¦ 㱸.. bool bExist = false; CXTPPropertyGridItem *pCategory = NULL; for( DWORD j=0; jGetCategory() ) == NULL ) { pCategory = vecCategory[j].pItem; bExist = true; break; } } if( bExist == false ) { pCategory = m_PropertyGrid.AddCategory( pVariable->GetCategory() ); CategoryStruct Struct; Struct.szStr = pVariable->GetCategory(); Struct.pItem = pCategory; vecCategory.push_back( Struct ); } // ¾ÆÅÛÀ» Àμ­Æ® ½ÃÄÑÁØ´Ù. OnSetValue( pVariable, i ); CXTPPropertyGridItem *pSubItem = CreateItem( pVariable ); if( pSubItem ) { pSubItem->SetReadOnly( !pVariable->IsDefaultEnable() ); if( pVariable->GetSubDescription() ) { const char *pStr = _GetSubStrByCount( 0, (char*)pVariable->GetSubDescription(), '|' ); pSubItem->SetDescription( pStr ); } pCategory->AddChildItem( pSubItem ); m_pVecItem.push_back( pSubItem ); m_pVecVariable.push_back( pVariable ); if( pVariable->IsCustomDialog() ) { pSubItem->SetFlags( pSubItem->GetFlags() | xtpGridItemHasExpandButton ); } } } for( DWORD i=0; iExpand(); } return true; } LRESULT CPropertyGridImp::ProcessNotifyGrid( WPARAM wParam, LPARAM lParam ) { int nGridAction = (int)wParam; CXTPPropertyGridItem *pItem = (CXTPPropertyGridItem *)lParam; switch( nGridAction ) { case XTP_PGN_ITEMVALUE_CHANGED: { std::vector *pVecList; if( m_bSelfAlloc == true ) pVecList = &m_pVecVariable; else pVecList = m_ppVecVariable; for( DWORD i=0; isize(); i++ ) { CUnionValueProperty *pVariable = (*pVecList)[i]; if( pVariable->GetXTPropItem() == pItem ) { m_bUpdateItem = false; CString szStr = pItem->GetValue(); switch( pVariable->GetType() ) { case CUnionValueProperty::Float: pVariable->SetVariable( (float)atof(szStr) ); break; case CUnionValueProperty::Char: pVariable->SetVariable( (char*)*szStr.GetBuffer() ); break; case CUnionValueProperty::String: pVariable->SetVariable( szStr.GetBuffer() ); break; case CUnionValueProperty::Integer_Combo: { for( int j=1; ; j++ ) { const char *szString = _GetSubStrByCount( j, (char*)pVariable->GetSubDescription() ); if( strcmp( szStr, szString ) == 0 ) { pVariable->SetVariable( j - 1 ); break; } } } break; case CUnionValueProperty::String_FileOpen: { pVariable->SetVariable( szStr.GetBuffer() ); } break; } OnChangeValue( pVariable, i ); if( pVariable->GetType() == CUnionValueProperty::String_FileOpen || m_bUpdateItem == true ) pItem->SetValue( *pVariable->GetBindStr() ); break; } } } break; case XTP_PGN_SELECTION_CHANGED: { std::vector *pVecList; if( m_bSelfAlloc == true ) pVecList = &m_pVecVariable; else pVecList = m_ppVecVariable; if( pVecList == NULL ) break; for( DWORD i=0; isize(); i++ ) { CUnionValueProperty *pVariable = (*pVecList)[i]; if( pVariable->GetDescription() == pItem->GetCaption() ) { OnSelectChangeValue( pVariable, i ); if( pVariable->GetType() == CUnionValueProperty::String_FileOpen || m_bUpdateItem == true ) pItem->SetValue( *pVariable->GetBindStr() ); break; } } } break; } return S_OK; } LRESULT CPropertyGridImp::ProcessCustomDialogGrid( WPARAM wParam, LPARAM lParam ) { CXTPPropertyGridItem *pItem = (CXTPPropertyGridItem *)lParam; std::vector *pVecList; if( m_bSelfAlloc == true ) pVecList = &m_pVecVariable; else pVecList = m_ppVecVariable; if( pVecList == NULL ) return S_OK; for( DWORD i=0; isize(); i++ ) { CUnionValueProperty *pVariable = (*pVecList)[i]; if( pVariable->GetDescription() == pItem->GetCaption() ) { OnCustomDialogValue( pVariable, i ); break; } } return S_OK; } void CPropertyGridImp::ModifyItem( WPARAM wParam, LPARAM lParam ) { int nItemIndex = (int)wParam; CUnionValueProperty *pVariable = (CUnionValueProperty *)lParam; if( nItemIndex >= (int)m_pVecItem.size() ) { ASSERT( 0 && _T("Index Overflow") ); return; } m_pVecItem[ nItemIndex ]->SetValue( *pVariable->GetBindStr() ); } void CPropertyGridImp::SetReadOnly( DWORD dwIndex, bool bReadonly ) { if( dwIndex < 0 || dwIndex >= m_pVecItem.size() ) return; m_pVecItem[dwIndex]->SetReadOnly( bReadonly ); } void CPropertyGridImp::SetReadOnly( CUnionValueProperty *pVariable, bool bReadonly ) { pVariable->SetDefaultEnable( !bReadonly ); } void CPropertyGridImp::RefreshPropertyGridVariable() { std::vector *pVecList; if( m_bSelfAlloc == true ) pVecList = &m_pVecVariable; else pVecList = m_ppVecVariable; for( DWORD i=0; isize(); i++ ) { CUnionValueProperty *pVariable = (*pVecList)[i]; OnSetValue( pVariable, i ); pVariable->GetXTPropItem()->SetValue( *pVariable->GetBindStr() ); } } void CPropertyGridImp::UpdateItem() { m_bUpdateItem = true; } void CPropertyGridImp::SetInitDirectory( const char * szInitDirectory ) { m_szInitDirectory = std::string( szInitDirectory ); }