00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "xFileDataNodeTemplate.h"
00016 #include "indent.h"
00017 #include "xFileParseData.h"
00018 #include "xLexerDefs.h"
00019 #include "config_xfile.h"
00020
00021 TypeHandle XFileDataNodeTemplate::_type_handle;
00022
00023
00024
00025
00026
00027
00028 XFileDataNodeTemplate::
00029 XFileDataNodeTemplate(XFile *x_file, const string &name,
00030 XFileTemplate *xtemplate) :
00031 XFileDataNode(x_file, name, xtemplate)
00032 {
00033 }
00034
00035
00036
00037
00038
00039
00040
00041 void XFileDataNodeTemplate::
00042 zero_fill() {
00043 _template->fill_zero_data(this);
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053 bool XFileDataNodeTemplate::
00054 is_complex_object() const {
00055 return true;
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065 void XFileDataNodeTemplate::
00066 add_parse_double(PTA_double double_list) {
00067 XFileParseData pdata;
00068 pdata._double_list = double_list;
00069 pdata._parse_flags = XFileParseData::PF_double;
00070
00071 _parse_data_list._list.push_back(pdata);
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081 void XFileDataNodeTemplate::
00082 add_parse_int(PTA_int int_list) {
00083 XFileParseData pdata;
00084 pdata._int_list = int_list;
00085 pdata._parse_flags = XFileParseData::PF_int;
00086
00087 _parse_data_list._list.push_back(pdata);
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097 void XFileDataNodeTemplate::
00098 add_parse_string(const string &str) {
00099 XFileParseData pdata;
00100 pdata._string = str;
00101 pdata._parse_flags = XFileParseData::PF_string;
00102
00103 _parse_data_list._list.push_back(pdata);
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 bool XFileDataNodeTemplate::
00116 finalize_parse_data() {
00117
00118
00119
00120 PrevData prev_data;
00121 size_t index = 0;
00122 size_t sub_index = 0;
00123
00124 if (!_template->repack_data(this, _parse_data_list,
00125 prev_data, index, sub_index)) {
00126 return false;
00127 }
00128
00129 if (index != _parse_data_list._list.size()) {
00130 xyywarning("Too many data elements in structure.");
00131 }
00132
00133 return true;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 bool XFileDataNodeTemplate::
00145 add_element(XFileDataObject *element) {
00146 _nested_elements.push_back(element);
00147 return true;
00148 }
00149
00150
00151
00152
00153
00154
00155
00156 void XFileDataNodeTemplate::
00157 write_text(ostream &out, int indent_level) const {
00158 indent(out, indent_level)
00159 << _template->get_name();
00160 if (has_name()) {
00161 out << " " << get_name();
00162 }
00163 out << " {\n";
00164
00165 NestedElements::const_iterator ni;
00166 for (ni = _nested_elements.begin(); ni != _nested_elements.end(); ++ni) {
00167 (*ni)->write_data(out, indent_level + 2, ";");
00168 }
00169
00170 XFileNode::write_text(out, indent_level + 2);
00171 indent(out, indent_level)
00172 << "}\n";
00173 }
00174
00175
00176
00177
00178
00179
00180
00181 void XFileDataNodeTemplate::
00182 write_data(ostream &out, int indent_level, const char *separator) const {
00183 if (!_nested_elements.empty()) {
00184 bool indented = false;
00185 for (size_t i = 0; i < _nested_elements.size() - 1; i++) {
00186 XFileDataObject *object = _nested_elements[i];
00187 if (object->is_complex_object()) {
00188
00189
00190 if (indented) {
00191 out << "\n";
00192 indented = false;
00193 }
00194 object->write_data(out, indent_level, ";");
00195
00196 } else {
00197
00198 if (!indented) {
00199 indent(out, indent_level);
00200 indented = true;
00201 }
00202 out << *object << "; ";
00203 }
00204 }
00205
00206
00207
00208 XFileDataObject *object = _nested_elements.back();
00209 if (object->is_complex_object()) {
00210 if (indented) {
00211 out << "\n";
00212 }
00213 string combined_separator = string(";") + string(separator);
00214 object->write_data(out, indent_level, combined_separator.c_str());
00215
00216 } else {
00217 if (!indented) {
00218 indent(out, indent_level);
00219 }
00220 out << *object << ";" << separator << "\n";
00221 }
00222 }
00223 }
00224
00225
00226
00227
00228
00229
00230
00231
00232 int XFileDataNodeTemplate::
00233 get_num_elements() const {
00234 return _nested_elements.size();
00235 }
00236
00237
00238
00239
00240
00241
00242
00243 XFileDataObject *XFileDataNodeTemplate::
00244 get_element(int n) {
00245 nassertr(n >= 0 && n < (int)_nested_elements.size(), NULL);
00246 return _nested_elements[n];
00247 }
00248
00249
00250
00251
00252
00253
00254
00255 XFileDataObject *XFileDataNodeTemplate::
00256 get_element(const string &name) {
00257 int child_index = _template->find_child_index(name);
00258 if (child_index >= 0) {
00259 return get_element(child_index);
00260 }
00261 xfile_cat.warning()
00262 << "\"" << name << "\" not a member of " << _template->get_name()
00263 << "\n";
00264 return NULL;
00265 }