set<int> CDesertConfigDialog::computeConfigList(HTREEITEM &item, set<int> cfgIds) { set<int> ret_ids; if(m_cfgtree.GetCheck(item) && item!=m_cfgTreeRootItem) { noneChecked = true; set<int> curr_ids = dhelper_ptr->getConfigurationsfromElement(cfgTreeMap[item]); for(set<int>::iterator it=curr_ids.begin();it!=curr_ids.end();++it) { if(cfgIds.find((*it))!=cfgIds.end()) ret_ids.insert((*it)); } } else ret_ids = cfgIds; if(!m_cfgtree.ItemHasChildren(item)) return ret_ids; std::string itemType = dhelper_ptr->getElementType(cfgTreeMap[item]); HTREEITEM hNextItem; HTREEITEM hChildItem = m_cfgtree.GetChildItem(item); if(itemType=="Alternative" || itemType=="Optional") { set<int> tmp_ids = ret_ids; ret_ids.clear(); bool changed = false; while (hChildItem != NULL) { set<int> child_ids = computeConfigList(hChildItem, tmp_ids); if(child_ids!=tmp_ids || m_cfgtree.GetCheck(hChildItem)) { ret_ids.insert(child_ids.begin(), child_ids.end()); changed = true; } hNextItem = m_cfgtree.GetNextItem(hChildItem, TVGN_NEXT); hChildItem = hNextItem; } if(!changed) ret_ids = tmp_ids; } else { while (hChildItem != NULL) { ret_ids = computeConfigList(hChildItem, ret_ids); hNextItem = m_cfgtree.GetNextItem(hChildItem, TVGN_NEXT); hChildItem = hNextItem; } } return ret_ids; }
LRESULT CDesertConfigDialog::OnTreeViewCheckStateChange(WPARAM wParam, LPARAM lParam) { // Handle message here… for(map<HTREEITEM, int>::iterator i=cfgTreeMap.begin();i!=cfgTreeMap.end();++i) { HTREEITEM node = (*i).first; m_cfgtree.SetItemState(node,0, TVIS_BOLD); } HTREEITEM changedItem = (HTREEITEM)lParam; bool check=true; if(m_cfgtree.GetCheck(changedItem)) checkItem(changedItem); else { uncheckItem(changedItem); check=false; } set<int> cfgIds; for(long i=0;i<cfgSize;++i) cfgIds.insert(i); noneChecked = false; /*if(!noneChecked) cfgIds.clear(); updateConfigList(cfgIds); updateSize(cfgIds.size());*/ set<int> valid_ids = computeConfigList(m_cfgTreeRootItem, cfgIds); if(!noneChecked) valid_ids.clear(); updateConfigList( valid_ids, check); int cnt = m_cfglist.GetItemCount(); int checked=0; for(int i=0;i<cnt;++i) { if(m_cfglist.GetCheck(i)) checked++; } updateSize( checked); return 0; }