summaryrefslogtreecommitdiff
path: root/inputmethods/dasher/DasherNode.h
blob: fb00d47cf8c95afac7bddfaeced87fd01fc469a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// DasherNode.h
//
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2001-2002 David Ward
//
/////////////////////////////////////////////////////////////////////////////

#ifndef __DasherNode_h__
#define __DasherNode_h__

#include "NoClones.h"
#include "DasherTypes.h"
#include "LanguageModel.h"

namespace Dasher {class CDasherNode;}
class Dasher::CDasherNode : private NoClones
{
	// CDasherNode represents a rectangle and character 
	// nodes have children, siblings and parents
private:
	const unsigned int m_iLbnd,m_iHbnd;// the cumulative lower and upper bound prob relative to parent
	const unsigned int m_iGroup;       // group membership - e.g. 0=nothing 1=caps 2=punc
	unsigned int m_iChars, m_iAge;
	bool m_bAlive;                     // if true, then display node, else dont bother
	bool m_bControlNode;               // if true, node is a control node
	bool m_bControlChild;              // if true, node is offspring of a control node
	//bool m_Cscheme;                  // color scheme for the node - alternates through relatives
	Opts::ColorSchemes m_ColorScheme;
	int m_iPhase;                      // index for coloring
	int m_iColour;                     // for the advanced colour mode
	
	const symbol m_Symbol;             // the character to display
	CLanguageModel *m_languagemodel;   // pointer to the language model - in future, could be different for each node	
	CDasherNode **m_Children;          // pointer to array of children
	CDasherNode *m_parent;             // pointer to parent - only needed to grab parent context
	CLanguageModel::CNodeContext *m_context;
public:
	
	CDasherNode(CDasherNode *parent,symbol Symbol, unsigned int igroup, int iphase, Opts::ColorSchemes ColorScheme,int ilbnd,int ihbnd,CLanguageModel *lm, int Colour);
	~CDasherNode();
	bool m_bForce;                     // flag to force a node to be drawn - shouldn't be public
    
	// return private data members - read only 
	CDasherNode ** const Children() const {return m_Children;}
	unsigned int Lbnd() const {return m_iLbnd;}
	bool Alive() {return m_bAlive;}
	bool Control() {return m_bControlChild;}
	void Kill()  {m_bAlive=0;m_iAge=0;}
	unsigned int Hbnd() const {return m_iHbnd;}
	unsigned int Group() const {return m_iGroup;}
	unsigned int Age() const {return m_iAge;}
	symbol Symbol() const {return m_Symbol;}
	unsigned int Chars() const {return m_iChars;}
	int Phase() const {return m_iPhase;}
	Opts::ColorSchemes Cscheme() const {return m_ColorScheme;}
	int Colour() const {return m_iColour;}
	
	CDasherNode* const Get_node_under(int,myint y1,myint y2,myint smousex,myint smousey); // find node under given co-ords
	void Get_string_under(const int,const myint y1,const myint y2,const myint smousex,const myint smousey,std::vector<symbol>&) const; // get string under given co-ords
	void Generic_Push_Node(CLanguageModel::CNodeContext *context);
	void Push_Node();                                      // give birth to children
	void Push_Node(CLanguageModel::CNodeContext *context); // give birth to children with this context
	void Delete_children();
	void Dump_node() const;                                // diagnostic
};

/////////////////////////////////////////////////////////////////////////////
// Inline functions
/////////////////////////////////////////////////////////////////////////////

using namespace Dasher;
using namespace Opts;

/////////////////////////////////////////////////////////////////////////////

inline CDasherNode::CDasherNode(CDasherNode *parent,symbol Symbol, unsigned int igroup, int iphase, ColorSchemes ColorScheme,int ilbnd,int ihbnd,CLanguageModel *lm, int Colour=0) :
 	  m_iLbnd(ilbnd),
	  m_iHbnd(ihbnd),
	  m_iGroup(igroup),
          m_iChars(0), 
          m_iAge(0), 
	  m_bAlive(1), 
          m_bControlChild(false),
	  m_ColorScheme(ColorScheme), 
	  m_iPhase(iphase),
          m_iColour(Colour),
	  m_Symbol(Symbol),
	  m_languagemodel(lm),
          m_Children(0), 
	  m_parent(parent),
	  m_context(0),  
	  m_bForce(false)
{
	/*
	switch (ColorScheme) {
		case Nodes1:
			m_ColorScheme = Nodes2;
			break;
		case Nodes2:
			m_ColorScheme = Nodes1;
			break;
		case Special1:
			m_ColorScheme = Special2;
			break;
		case Special2:
			m_ColorScheme = Special1;
			break;
		case default:
			m_ColorScheme = ColorScheme;
			break;
	}
	*/
}

/////////////////////////////////////////////////////////////////////////////

inline void CDasherNode::Delete_children() 
{
	if (m_Children) {
		unsigned int i; 
		for (i=1;i<m_iChars;i++)
			delete m_Children[i];
		delete [] m_Children;
	}
	m_Children=0;
	
}

/////////////////////////////////////////////////////////////////////////////

inline CDasherNode::~CDasherNode() 
{
	Delete_children();
	if (m_context)
		m_languagemodel->ReleaseNodeContext(m_context);
}

/////////////////////////////////////////////////////////////////////////////

#endif /* #ifndef __DasherNode_h__ */