void LCPBar::parse(XmlReader& reader) { XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* name = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(name, value)) { continue; } else { std::cerr << "Unknown attribute '" << name << "' skipped in PBar.\n"; } } if(getName() == "PBar") { //LCPBarInstance = this; //FIXME old code compability hack LCPBarPage1 = this; } else if(getName() == "PBar2nd") { LCPBarPage2 = this;} else { std::cerr << "Unknown LCBar component '" << getName() << "' found.\n";} Component* component = parseEmbeddedComponent(reader); addChild(component); width = component->getWidth(); height = component->getHeight(); }
void ScrollView::parse(XmlReader& reader) { // parse xml attributes XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* attribute = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(attribute, value)) { continue; } else { std::cerr << "Skipping unknown attribute '" << attribute << "'.\n"; } } // we need 2 child components childs.assign(2, Child()); // parse xml contents int depth = reader.getDepth(); while(reader.read() && reader.getDepth() > depth) { if(reader.getNodeType() == XML_READER_TYPE_ELEMENT) { std::string element = (const char*) reader.getName(); if(element == "scrollbar") { std::auto_ptr<ScrollBar> scrollbar (new ScrollBar()); scrollbar->parse(reader); resetChild(scrollBar(), scrollbar.release()); } else if(element == "contents") { resetChild(contents(), parseEmbeddedComponent(reader)); } else { std::cerr << "Skipping unknown element '" << element << "'.\n"; } } } if(scrollBar().getComponent() == 0) { throw std::runtime_error("No ScrollBar specified in ScrollView"); } ScrollBar* scrollBarComponent = (ScrollBar*) scrollBar().getComponent(); scrollBarComponent->valueChanged.connect( makeCallback(*this, &ScrollView::scrollBarChanged)); setFlags(FLAG_RESIZABLE); }
void Panel::parse(XmlReader& reader) { XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* attribute = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(attribute, value)) { continue; } else if(strcmp(attribute, "background") == 0) { background = 0; background = texture_manager->load(value); } else if(strcmp(attribute, "width") == 0) { if(sscanf(value, "%f", &width) != 1) { std::stringstream msg; msg << "Parse error when parsing width (" << value << ")"; throw std::runtime_error(msg.str()); } } else if(strcmp(attribute, "height") == 0) { if(sscanf(value, "%f", &height) != 1) { std::stringstream msg; msg << "Parse error when parsing height (" << value << ")"; throw std::runtime_error(msg.str()); } } else { std::cerr << "Skipping unknown attribute '" << attribute << "'.\n"; } } if(width <= 0 || height <= 0) { throw std::runtime_error("invalid width/height"); } Component* component = parseEmbeddedComponent(reader); addChild(component); if(component->getFlags() & FLAG_RESIZABLE) { component->resize(width, height); } }
void LCPBar::parse(XmlReader& reader) { XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* name = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(name, value)) { continue; } else { std::cerr << "Unknown attribute '" << name << "' skipped in PBar.\n"; } } Component* component = parseEmbeddedComponent(reader); addChild(component); width = component->getWidth(); height = component->getHeight(); }
void TableLayout::parse(XmlReader& reader) { int rows = -1, cols = -1; border = false; XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* attribute = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(attribute, value)) { continue; } else if(strcmp(attribute, "rows") == 0) { if(sscanf(value, "%d", &rows) != 1) { std::stringstream msg; msg << "Error while parsing rows attribute: " << value; throw std::runtime_error(msg.str()); } } else if(strcmp(attribute, "cols") == 0) { if(sscanf(value, "%d", &cols) != 1) { std::stringstream msg; msg << "Error while parsing cols attribute: " << value; throw std::runtime_error(msg.str()); } } else if(strcmp(attribute, "border") == 0) { if(strcmp(value, "true") == 0) { border = true; } else if(strcmp(value, "false") == 0) { border = false; } else { std::cerr << "Invalid value for border attribute. " "Please specify 'true' or 'false'\n"; } } else { std::cerr << "Skipping unknown attribute '" << attribute << "'.\n"; } } if(rows <= 0 || cols <= 0) { throw std::runtime_error("Invalid values for rows/cols"); } rowproperties.assign(rows, RowColProperties()); colproperties.assign(cols, RowColProperties()); cells.assign(rows*cols, Cell()); int depth = reader.getDepth(); while(reader.read() && reader.getDepth() > depth) { if(reader.getNodeType() == XML_READER_TYPE_ELEMENT) { const std::string& element = (const char*) reader.getName(); if(element == "rowsize") { RowColProperties props; int num = parseProperties(reader, props) - 1; if(num < 0 || num >= rows) { std::cerr << "Invalid row specified in rowsize element.\n"; continue; } rowproperties[num] = props; } else if(element == "colsize") { RowColProperties props; int num = parseProperties(reader, props) - 1; if(num < 0 || num >= cols) { std::cerr << "Invalid col specified in colsize element.\n"; continue; } colproperties[num] = props; } else if(element == "cell") { int row = -1, col = -1; int colspan = 1, rowspan = 1; Cell::Alignment halign = Cell::CENTER; Cell::Alignment valign = Cell::CENTER; XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* name = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(strcmp(name, "row") == 0) { if(sscanf(value, "%d", &row) != 1) { std::cerr << "Couldn't parse integer value '" << value << "' in row attribute.\n"; } } else if(strcmp(name, "col") == 0) { if(sscanf(value, "%d", &col) != 1) { std::cerr << "Couldn't parse integer value '" << value << "' in col attribute.\n"; } } else if(strcmp(name, "rowspan") == 0) { if(sscanf(value, "%d", &rowspan) != 1) { std::cerr << "Couldn't parse integer value '" << value << "' in rowspan attribute.\n"; } } else if(strcmp(name, "colspan") == 0) { if(sscanf(value, "%d", &colspan) != 1) { std::cerr << "Couldn't parse integer value '" << value << "' in colspan attribute.\n"; } } else if(strcmp(name, "halign") == 0) { if(strcmp(value, "left") == 0) { halign = Cell::LEFT; } else if(strcmp(value, "center") == 0) { halign = Cell::CENTER; } else if(strcmp(value, "right") == 0) { halign = Cell::RIGHT; } else { std::cerr << "Skipping unknown halignment value '" << value << "'.\n"; } } else if(strcmp(name, "valign") == 0) { if(strcmp(value, "top") == 0) { valign = Cell::TOP; } else if(strcmp(value, "center") == 0) { valign = Cell::CENTER; } else if(strcmp(value, "bottom") == 0) { valign = Cell::BOTTOM; } else { std::cerr << "Skipping unknown valignment value '" << value << "'.\n"; } } else { std::cerr << "Unknown attribute '" << name << "' in cell element.\n"; } } row--; col--; if(row < 0 || row >= rows) { std::cerr << "Skipping cell because row value is invalid.\n"; continue; } if(col < 0 || col >= cols) { std::cerr << "Skipping cell because col value is invalid.\n"; continue; } if(rowspan <= 0 || row + rowspan - 1 >= rows) { std::cerr << "rowspan value invalid.\n"; rowspan = 1; } if(colspan <= 0 || col + colspan - 1 >= cols) { std::cerr << "colspan value invalid.\n"; colspan = 1; } Component* component = parseEmbeddedComponent(reader); if(component == 0) { std::cerr << "No Component specified in cell " << (row+1) << ", " << (col+1) << "\n"; continue; } addChild(component); Cell cell(childs.size() - 1); cell.halign = halign; cell.valign = valign; cell.rowspan = rowspan; cell.colspan = colspan; cells[row*cols + col] = cell; } else { std::cerr << "Unknown element '" << element << "' in TableLayout.\n"; reader.nextNode(); continue; } } } }
/** * Parse a given XmlReader objest that represents the map. * * @param reader Reference to a XmlReader object representing a given XML file. */ void Window::parse(XmlReader& reader) { // parse attributes... XmlReader::AttributeIterator iter(reader); while(iter.next()) { const char* name = (const char*) iter.getName(); const char* value = (const char*) iter.getValue(); if(parseAttribute(name, value)) { continue; } else if(strcmp(name, "width") == 0) { if(sscanf(value, "%f", &width) != 1) { std::stringstream msg; msg << "Couldn't parse width attribute (" << value << ")."; throw std::runtime_error(msg.str()); } } else if(strcmp(name, "height") == 0) { if(sscanf(value, "%f", &height) != 1) { std::stringstream msg; msg << "Couldn't parse height attribute (" << value << ")."; throw std::runtime_error(msg.str()); } } else if(strcmp(name, "border") == 0) { if(sscanf(value, "%f", &border) != 1) { std::stringstream msg; msg << "Couldn't parse border attribute (" << value << ")."; throw std::runtime_error(msg.str()); } } else if(strcmp(name, "titlesize") == 0) { if(sscanf(value, "%f", &titlesize) != 1) { std::stringstream msg; msg << "Couldn't parse titlesize attribute (" << value << ")."; throw std::runtime_error(msg.str()); } } else { std::cerr << "Unknown attribute '" << name << "' skipped.\n"; } } if(width <= 0 || height <= 0) throw std::runtime_error("Width or Height invalid"); childs.assign(5, Child()); int depth = reader.getDepth(); while(reader.read() && reader.getDepth() > depth) { if(reader.getNodeType() == XML_READER_TYPE_ELEMENT) { std::string element = (const char*) reader.getName(); if(element == "title") { resetChild(title(), parseEmbeddedComponent(reader)); } else if(element == "closebutton") { std::auto_ptr<Button> button (new Button()); button->parse(reader); resetChild(closeButton(), button.release()); } else if(element == "contents") { resetChild(contents(), parseEmbeddedComponent(reader)); } else if(element == "background") { resetChild(background(), parseEmbeddedComponent(reader)); } else if(element == "title-background") { resetChild(title_background(), parseEmbeddedComponent(reader)); } else { std::cerr << "Skipping unknown element '" << element << "'.\n"; reader.nextNode(); } } } // layout float closeButtonHeight = 0; float closeButtonWidth = 0; float closeButtonBorder = 0; if(closeButton().getComponent() != 0) { closeButtonHeight = closeButton().getComponent()->getHeight(); if(titlesize < closeButtonHeight) { titlesize = closeButtonHeight; } closeButtonWidth = closeButton().getComponent()->getWidth(); closeButtonBorder = (titlesize - closeButtonHeight) / 2; closeButtonWidth += 2*closeButtonBorder; closeButtonHeight += 2*closeButtonBorder; } float compWidth = width - 2*border; float compHeight = height - 2*border; title().setPos(Vector2(border, border)); title().getComponent()->resize(compWidth - closeButtonWidth, titlesize); if(title_background().getComponent() != 0) { title_background().setPos(title().getPos()); title_background().getComponent()->resize( compWidth - closeButtonWidth, titlesize); } if(closeButton().getComponent() != 0) { closeButton().setPos(Vector2( border + compWidth - closeButtonWidth + closeButtonBorder, border + closeButtonBorder)); } contents().setPos(Vector2(border, border + titlesize)); contents().getComponent()->resize(compWidth, compHeight - titlesize); if(background().getComponent() != 0) { background().setPos(Vector2(0, 0)); background().getComponent()->resize(width, height); } // connect signals... if(closeButton().getComponent() != 0) { Button* button = (Button*) closeButton().getComponent(); button->clicked.connect( makeCallback(*this, &Window::closeButtonClicked)); } }