File: tree_item.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (215 lines) | stat: -rw-r--r-- 4,541 bytes parent folder | download | duplicates (3)
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef ULTIMA_SHARED_CORE_TREE_ITEM_H
#define ULTIMA_SHARED_CORE_TREE_ITEM_H

#include "ultima/shared/core/message_target.h"

namespace Ultima {
namespace Shared {

namespace Gfx {
class VisualItem;
} // End of namespace Gfx

namespace Maps {
class Map;
} // End of namespace Maps

class Game;
class GameManager;
class GameState;
class Events;
class Map;
class NamedItem;
class CMessage;

/**
 * This implements the base for objects can form a class hierarchy, with parents, children, and siblings
 * that messages can be passed around.
 */
class TreeItem: public MessageTarget {
	friend class CMessage;
	DECLARE_MESSAGE_MAP;
private:
	TreeItem *_parent;
	TreeItem *_nextSibling;
	TreeItem *_priorSibling;
	TreeItem *_firstChild;
	DisposeAfterUse::Flag _disposeAfterUse;
public:
	CLASSDEF;
	TreeItem();

	/**
	 * Gets the name of the item, if any
	 */
	virtual const Common::String getName() const {
		return Common::String();
	}

	/**
	 * Returns true if the item's name matches a passed name
	 */
	virtual bool isEquals(const Common::String &name, int maxLen = 0) const {
		return false;
	}

	/**
	 * Compares the name of the item to a passed name
	 */
	virtual int compareTo(const Common::String &name, int maxLen = 0) const {
		return false;
	}

	/**
	 * Called when the view changes
	 */
	virtual void viewChange() {
	}

	/**
	 * Get the parent for the given item
	 */
	TreeItem *getParent() const {
		return _parent;
	}

	/**
	 * Jumps up through the parents to find the root game
	 */
	Game *getGame();

	/**
	 * Jumps up through the parents to find the root game
	 */
	const Game *getGame() const;

	/**
	 * Returns the currently active game view
	 */
	Gfx::VisualItem *getView();

	/**
	 * Get the next sibling
	 */
	TreeItem *getNextSibling() const {
		return _nextSibling;
	}

	/**
	 * Get the prior sibling
	 */
	TreeItem *getPriorSibling() const {
		return _priorSibling;
	}

	/**
	 * Get the last sibling of this sibling
	 */
	TreeItem *getLastSibling();

	/**
	 * Get the first child of the item, if any
	 */
	TreeItem *getFirstChild() const {
		return _firstChild;
	}

	/**
	 * Get the last child of the item, if any
	 */
	TreeItem *getLastChild() const;

	/**
	 * Given all the recursive children of the tree item, gives the next
	 * item in sequence to the passed starting item
	 */
	TreeItem *scan(TreeItem *item) const;

	/**
	 * Find the first child item that is of a given type
	 */
	TreeItem *findChildInstanceOf(const ClassDef &classDef) const;

	/**
	 * Find the next sibling item that is of the given type
	 */
	TreeItem *findNextInstanceOf(const ClassDef &classDef, TreeItem *startItem) const;

	/**
	 * Adds the item under another tree item
	 */
	void addUnder(TreeItem *newParent);

	/**
	 * Adds a new child under this one
	 */
	void addChild(TreeItem *child);

	/**
	 * Sets the parent for the item
	 */
	void setParent(TreeItem *newParent);

	/**
	 * Adds the item as a sibling of another item
	 */
	void addSibling(TreeItem *item);

	/**
	 * Moves the tree item to be under another parent
	 */
	void moveUnder(TreeItem *newParent);

	/**
	 * Destroys both the item as well as any of it's children
	 */
	void destroyAll();

	/**
	 * Destroys all child tree items under this one.
	 * @returns		Total number of tree items recursively removed
	 */
	int destroyChildren();

	/**
	 * Detach the tree item from any other associated tree items
	 */
	void detach();

	/**
	 * Attaches a tree item to a new node
	 */
	void attach(TreeItem *item);

	/**
	 * Finds a tree item by name
	 * @param name		Name to find
	 */
	NamedItem *findByName(const Common::String &name);
};

} // End of namespace Shared
} // End of namespace Ultima

#endif