Fixing bugs in conversion mode
[dasher.git] / Src / DasherCore / ConversionManager.cpp
blob8f853658566465e334fdaac87192ef9bbe119a36
1 #include "ConversionManager.h"
3 #include <string>
4 #include <vector>
6 using namespace Dasher;
8 CConversionManager::CConversionManager(CDasherModel *pModel, CLanguageModel *pLanguageModel) {
9 m_pModel = pModel;
10 m_pLanguageModel = pLanguageModel;
12 // Assume that this is sorted:
13 std::vector<std::string> vCandidateList;
15 vCandidateList.push_back("hello");
16 vCandidateList.push_back("foo");
17 vCandidateList.push_back("fish");
19 // TODO: Delete list when we're done
21 m_pRoot = new CConversionManagerNode;
23 m_pRoot->m_strSymbol = "Convert";
24 m_pRoot->m_pChild = 0;
25 m_pRoot->m_pNext = 0;
26 m_pRoot->m_iNumChildren = 0;
28 for(std::vector<std::string>::iterator it(vCandidateList.begin()); it != vCandidateList.end(); ++it) {
29 CConversionManagerNode *pCurrentNode(m_pRoot);
31 // TODO: Need to do unicode here!
34 for(int j(0); j < it->size(); ++j) {
35 CConversionManagerNode *pNextNode;
37 pNextNode = pCurrentNode->FindChild(it->substr(j,1));
39 if(!pNextNode) {
40 pNextNode = new CConversionManagerNode;
42 pNextNode->m_strSymbol = it->substr(j,1);
43 pNextNode->m_pChild = 0;
44 pNextNode->m_pNext = pCurrentNode->m_pChild;
45 pNextNode->m_iNumChildren = 0;
46 pCurrentNode->m_pChild = pNextNode;
47 ++pCurrentNode->m_iNumChildren;
50 pCurrentNode = pNextNode;
55 // TODO: Actually need ref counting this time around - and need to check that it's properly implemented elsewhere
56 void CConversionManager::Ref() {
59 void CConversionManager::Unref() {
62 CDasherNode *CConversionManager::GetRoot(CDasherNode *pParent, int iLower, int iUpper, void *pUserData) {
63 CDasherNode *pNewNode;
65 // TODO: Parameters here are placeholders - need to figure out what's right
66 pNewNode = new CDasherNode(pParent, m_pModel->GetStartConversionSymbol(), 0, Opts::Nodes2, iLower, iUpper, m_pLanguageModel, 2);
68 // FIXME - handle context properly
69 pNewNode->SetContext(m_pLanguageModel->CreateEmptyContext());
71 pNewNode->m_pNodeManager = this;
72 pNewNode->m_pUserData = m_pRoot;
73 pNewNode->m_strDisplayText = m_pRoot->m_strSymbol;
74 pNewNode->m_bShove = false;
75 pNewNode->m_pBaseGroup = 0;
77 return pNewNode;
80 void CConversionManager::PopulateChildren( CDasherNode *pNode ) {
82 CDasherNode *pNewNode;
84 CConversionManagerNode *pCurrentCMNode(static_cast<CConversionManagerNode *>(pNode->m_pUserData));
85 CConversionManagerNode *pCurrentCMChild(pCurrentCMNode->m_pChild);
88 if(pCurrentCMChild) {
89 int iIdx(0);
91 while(pCurrentCMChild) {
92 int iLbnd( iIdx*(m_pModel->GetLongParameter(LP_NORMALIZATION)/pCurrentCMNode->m_iNumChildren));
93 int iHbnd( (iIdx+1)*(m_pModel->GetLongParameter(LP_NORMALIZATION)/pCurrentCMNode->m_iNumChildren));
95 // TODO: Parameters here are placeholders - need to figure out what's right
96 pNewNode = new CDasherNode(pNode, m_pModel->GetStartConversionSymbol(), 0, Opts::Nodes2, iLbnd, iHbnd, m_pLanguageModel, 1);
98 // FIXME - handle context properly
99 pNewNode->SetContext(m_pLanguageModel->CreateEmptyContext());
101 pNewNode->m_pNodeManager = this;
102 pNewNode->m_pUserData = m_pRoot;
103 pNewNode->m_strDisplayText = pCurrentCMChild->m_strSymbol;
104 pNewNode->m_bShove = false;
105 pNewNode->m_pBaseGroup = 0;
107 pNode->Children().push_back(pNewNode);
109 pCurrentCMChild = pCurrentCMChild->m_pNext;
110 ++iIdx;
113 else {
114 // TODO: Placeholder algorithm here
115 for(int i(0); i < 2; ++i) {
116 int iLbnd( i*(m_pModel->GetLongParameter(LP_NORMALIZATION)/2));
117 int iHbnd( (i+1)*(m_pModel->GetLongParameter(LP_NORMALIZATION)/2));
119 pNewNode = m_pModel->GetRoot(0, pNode, iLbnd, iHbnd, NULL);
120 pNewNode->Seen(false);
122 pNode->Children().push_back(pNewNode);
127 void CConversionManager::ClearNode( CDasherNode *pNode ) {