void CEntitiesDialog::OnDblclkPropertieslist() { // Double-click on the item...Edit it. mCurrentKey = m_PropertiesList.GetCurSel (); if (mCurrentKey != LB_ERR) { CEntity *Ent = &((*mEntityArray)[mCurrentEntity]); CString EntityTypeName = Ent->GetClassname (); CString KeyName; CString TheValue; m_PropertiesList.GetText (mCurrentKey, KeyName); Ent->GetKeyValue (KeyName, TheValue); TopType eType; if (EntityTable_GetEntityPropertyType (Level_GetEntityDefs (pDoc->pLevel), EntityTypeName, KeyName, &eType)) { CDialog *pEditDialog = NULL; // Create the dialog that's appropriate for this type.... switch (eType) { case T_INT : pEditDialog = new CIntKeyEditDlg (this, KeyName, &TheValue); break; case T_FLOAT : pEditDialog = new CFloatKeyEditDlg (this, KeyName, &TheValue); break; case T_COLOR : pEditDialog = new CColorKeyEditDlg (this, KeyName, &TheValue); break; case T_POINT : pEditDialog = new CPointKeyEditDlg (this, KeyName, &TheValue); break; case T_STRING : pEditDialog = new CKeyEditDlg (this, KeyName, &TheValue); break; case T_MODEL : pEditDialog = new CModelKeyEditDlg (this, Level_GetModelInfo (pDoc->pLevel)->Models, KeyName, &TheValue); break; case T_STRUCT : pEditDialog = new CStructKeyEditDlg (this, *Ent, KeyName, mEntityArray, &TheValue, Level_GetEntityDefs (pDoc->pLevel)); break; case T_BOOLEAN : pEditDialog = new CBoolKeyEditDlg (this, KeyName, &TheValue); break; case T_PTR : default : // bad or unknown type assert (0); break; } if (pEditDialog != NULL) { int ModalResult = pEditDialog->DoModal (); delete pEditDialog; if (ModalResult == IDOK) { if (MultiEntityFlag) { // multiple entities--change this property on all of them int i; for (i = 0; i < mEntityArray->GetSize (); ++i) { CEntity *pEnt; pEnt = &(*mEntityArray)[i]; if (pEnt->IsSelected ()) { pEnt->SetKeyValue (KeyName, TheValue); } } } else { // update Ent->SetKeyValue (KeyName, TheValue); } FillInKeyValuePairs(mCurrentKey); } } } } }
//================================================================================ // This function fills in the key value pairs for the current dialog. //================================================================================ void CEntitiesDialog::FillInKeyValuePairs(int Selection) { // now get the actual entity number from that int Entity ; //ASSERT( m_EntityCombo.GetItemData( m_EntityCombo.GetCurSel( ) ) == (DWORD)Entity ) ; Entity = m_EntityCombo.GetItemData( m_EntityCombo.GetCurSel( ) ) ; // now go through that entity and add key/value pairs // to the dialog m_PropertiesList.ResetContent(); // what do we have here? if( Entity == LB_ERR ) { mCurrentKey = LB_ERR; return; } CEntity *Ent = &((*mEntityArray)[Entity]); EntityPropertiesList const *pProps; // Get sorted list of published key/value pairs CString EntityClassname = Ent->GetClassname (); pProps = EntityTable_GetEntityPropertiesFromName (Level_GetEntityDefs (pDoc->pLevel), EntityClassname, ET_PUBLISHED); if (pProps != NULL) { // Add key/value pairs to the listbox for (int iProp = 0; iProp < pProps->NumProps; iProp++) { EntityProperty const *p; p = &(pProps->Props[iProp]); if (p->KeyNum == -1) { // a key number of -1 indicates the end of valid keys... break; } // if this key doesn't exist for this entity, then add it // and its default value... CString TheVal; if (!Ent->GetKeyValue (p->pKey, TheVal)) { Ent->SetKeyValue (p->pKey, p->pValue); } if (p->published) { // add it to the listbox m_PropertiesList.AddString (p->pKey); } } EntityTable_ReleaseEntityProperties (pProps); } else { /* We know nothing about this entity's type. We have the key/value pairs, but we don't know what's supposed to be published. So we'll display "unknown type". */ m_PropertiesList.AddString ("Unknown Entity Type"); Selection = LB_ERR; } // set the current m_PropertiesList.SetCurSel (Selection); }