home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 8090 / ModelEdit.7z / WeightEditDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-03-08  |  5.6 KB  |  268 lines

  1. // WeightEditDlg.cpp : implementation file
  2. //
  3.  
  4. #include "precompile.h"
  5. #include "modeledit.h"
  6. #include "weighteditdlg.h"
  7. #include "modeleditdlg.h"
  8. #include "stringdlg.h"
  9.  
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17. // WeightEditDlg dialog
  18.  
  19.  
  20. WeightEditDlg::WeightEditDlg(CWnd* pParent /*=NULL*/)
  21.     : CDialog(WeightEditDlg::IDD, pParent)
  22. {
  23.     //{{AFX_DATA_INIT(WeightEditDlg)
  24.         // NOTE: the ClassWizard will add member initialization here
  25.     //}}AFX_DATA_INIT
  26.     m_bUpdateWeights = TRUE;
  27.     m_bChangesMade = FALSE;
  28. }
  29.  
  30.  
  31. void WeightEditDlg::DoDataExchange(CDataExchange* pDX)
  32. {
  33.     CDialog::DoDataExchange(pDX);
  34.     //{{AFX_DATA_MAP(WeightEditDlg)
  35.     DDX_Control(pDX, IDC_WEIGHT, m_Weight);
  36.     DDX_Control(pDX, IDC_NODES, m_NodeList);
  37.     DDX_Control(pDX, IDC_WEIGHTSETS, m_WeightSets);
  38.     //}}AFX_DATA_MAP
  39. }
  40.  
  41.  
  42. BEGIN_MESSAGE_MAP(WeightEditDlg, CDialog)
  43.     //{{AFX_MSG_MAP(WeightEditDlg)
  44.     ON_BN_CLICKED(IDC_ADDSET, OnAddSet)
  45.     ON_BN_CLICKED(IDC_REMOVESET, OnRemoveSet)
  46.     ON_EN_UPDATE(IDC_WEIGHT, OnUpdateWeight)
  47.     ON_LBN_SELCHANGE(IDC_NODES, OnSelChangeNodes)
  48.     ON_LBN_SELCHANGE(IDC_WEIGHTSETS, OnSelchangeWeightsets)
  49.     //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51.  
  52.  
  53. /////////////////////////////////////////////////////////////////////////////
  54. /////////////////////////////////////////////////////////////////////////////
  55.  
  56. void WeightEditDlg::FillWeightSetList(BOOL bPreserveSel)
  57. {
  58.     DWORD i;
  59.     WeightSet *pSet;
  60.     int iCurSel;
  61.  
  62.  
  63.     iCurSel = m_WeightSets.GetCurSel();
  64.     m_WeightSets.ResetContent();
  65.  
  66.     for(i=0; i < m_pModel->NumWeightSets(); i++)
  67.     {
  68.         pSet = m_pModel->GetWeightSet(i);
  69.     
  70.         m_WeightSets.AddString(pSet->GetName());
  71.     }
  72.  
  73.     if(bPreserveSel)
  74.     {
  75.         if(iCurSel == LB_ERR)
  76.             m_WeightSets.SetCurSel(0);
  77.         else
  78.             m_WeightSets.SetCurSel(iCurSel);
  79.     }
  80. }
  81.  
  82. void WeightEditDlg::FillNodeList(BOOL bPreserveSel)
  83. {
  84.     DWORD i;
  85.     ModelNode *pNode;
  86.     int iCurSel;
  87.  
  88.     iCurSel = m_NodeList.GetCurSel();
  89.     m_NodeList.ResetContent();
  90.  
  91.     for(i=0; i < m_pModel->NumNodes(); i++)
  92.     {
  93.         pNode = m_pModel->GetNode(i);
  94.  
  95.         m_NodeList.AddString(pNode->GetName());
  96.     }
  97.  
  98.     if(bPreserveSel)
  99.     {
  100.         if(iCurSel == LB_ERR)
  101.             m_NodeList.SetCurSel(0);
  102.         else
  103.             m_NodeList.SetCurSel(iCurSel);
  104.     }
  105. }
  106.  
  107.  
  108. WeightSet* WeightEditDlg::GetCurSelections(
  109.     int *pNodes, DWORD nodeListSizeBytes, int &nNodes)
  110. {
  111.     int iCurSel;
  112.  
  113.     iCurSel = m_WeightSets.GetCurSel();
  114.     if(iCurSel < 0 || iCurSel >= (int)m_pModel->NumWeightSets())
  115.         return NULL;
  116.  
  117.     nNodes = m_NodeList.GetSelItems(nodeListSizeBytes/sizeof(int), pNodes);
  118.     if(nNodes <= 0 || nNodes > (int)m_pModel->NumNodes())
  119.         return NULL;
  120.  
  121.     return m_pModel->GetWeightSet(iCurSel);
  122. }
  123.  
  124.  
  125. void WeightEditDlg::HandleSelChange()
  126. {
  127.     WeightSet *pSet;
  128.     char str[256];
  129.     int nNodes, nodes[256];
  130.     
  131.     pSet = GetCurSelections(nodes, sizeof(nodes), nNodes);
  132.     if(!pSet)
  133.         return;
  134.  
  135.     m_bUpdateWeights = FALSE;
  136.         sprintf(str, "%.3f", pSet->m_Weights[nodes[0]]);
  137.         m_Weight.SetWindowText(str);
  138.     m_bUpdateWeights = TRUE;
  139. }
  140.  
  141.  
  142. /////////////////////////////////////////////////////////////////////////////
  143. // WeightEditDlg message handlers
  144.  
  145. void WeightEditDlg::OnAddSet() 
  146. {
  147.     CStringDlg dlg;
  148.     WeightSet *pSet;
  149.  
  150.     dlg.m_bAllowLetters = TRUE;
  151.     dlg.m_bAllowNumbers = TRUE;
  152.     dlg.m_bAllowOthers = TRUE;
  153.  
  154.     if(dlg.DoModal(IDS_NEWWEIGHTSET, IDS_ENTERWEIGHTSETNAME) == IDOK)
  155.     {
  156.         pSet = new WeightSet(m_pModel);
  157.         if(pSet)
  158.         {
  159.             if(!pSet->InitWeights(m_pModel->NumNodes()))
  160.             {
  161.                 delete pSet;
  162.                 return;
  163.             }
  164.  
  165.             pSet->SetName(dlg.m_EnteredText);
  166.             m_pModel->AddWeightSet(pSet);
  167.             FillWeightSetList(TRUE);
  168.             m_bChangesMade = TRUE;
  169.         }
  170.     }    
  171. }
  172.  
  173. void WeightEditDlg::OnRemoveSet() 
  174. {
  175.     int iCurSel;
  176.  
  177.     iCurSel = m_WeightSets.GetCurSel();
  178.     if(iCurSel < 0 || iCurSel >= (int)m_pModel->NumWeightSets())
  179.         return;
  180.  
  181.     m_pModel->RemoveWeightSet(iCurSel);
  182.     FillWeightSetList(TRUE);
  183.     m_bChangesMade = TRUE;
  184. }
  185.  
  186. void WeightEditDlg::OnUpdateWeight() 
  187. {
  188.     WeightSet *pSet;
  189.     int i, nNodes, nodes[256];
  190.     char str[256];
  191.     float theWeight;
  192.  
  193.     if(!m_bUpdateWeights)
  194.         return;
  195.  
  196.     pSet = GetCurSelections(nodes, sizeof(nodes), nNodes);
  197.     if(!pSet)
  198.         return;
  199.  
  200.     m_Weight.GetWindowText(str, sizeof(str));
  201.     theWeight = (float)atof(str);
  202.  
  203.     for(i=0; i < nNodes; i++)
  204.     {
  205.         pSet->m_Weights[nodes[i]] = theWeight;
  206.     }
  207.  
  208.     m_bChangesMade = TRUE;
  209. }
  210.  
  211. BOOL WeightEditDlg::OnInitDialog() 
  212. {
  213.     int i;
  214.  
  215.     CDialog::OnInitDialog();
  216.     
  217.     FillWeightSetList(TRUE);
  218.     FillNodeList(FALSE);
  219.  
  220.     for (i = 0; i < m_pDlg->m_NodeList.GetItemCount(); i++)
  221.     {
  222.         if (m_pDlg->m_NodeList.GetItemState(i, LVIS_SELECTED))
  223.             m_NodeList.SetSel(i, TRUE);
  224.     }
  225.  
  226.     return TRUE;
  227. }
  228.  
  229. void WeightEditDlg::OnSelChangeNodes() 
  230. {
  231.     HandleSelChange();
  232. }
  233.  
  234. //------------------------------------------------------------------
  235. //
  236. //   FUNCTION : OnSelchangeWeightsets()
  237. //
  238. //   PURPOSE  : Handles selection change in IDC_WEIGHTSET
  239. //
  240. //------------------------------------------------------------------
  241.  
  242. void WeightEditDlg::OnSelchangeWeightsets() 
  243. {
  244.     HandleSelChange();
  245.  
  246.     // Clear all selections within the node list listbox
  247.  
  248.     m_NodeList.SelItemRange(FALSE, 0, m_NodeList.GetCount());
  249.  
  250.     int nCurSel = m_WeightSets.GetCurSel();
  251.     if ((nCurSel != LB_ERR) && (nCurSel < (int)m_pModel->NumWeightSets()))
  252.     {        
  253.         WeightSet *pSet = m_pModel->GetWeightSet(nCurSel);
  254.  
  255.         // Select all the weighted nodes in this set.
  256.         
  257.         for (int i = 0; i < (int)pSet->m_Weights.GetSize(); i ++)
  258.         {
  259.             if (pSet->m_Weights[i] > 0.0f)
  260.             {
  261.                 // Select the node in the nodes list box
  262.  
  263.                 m_NodeList.SetSel(i, TRUE);
  264.             }
  265.         }
  266.     }    
  267. }
  268.