Files
commandergenius/project/jni/application/guichan-xml/xmlgui.cpp

866 lines
17 KiB
C++

#include "xmlgui.h"
#include <stdio.h>
#include <stdlib.h>
XmlGui::XmlGui()
{
}
bool XmlGui::parse(const std::string &filename)
{
TiXmlElement *element = NULL;
TiXmlNode *node = NULL;
doc = new TiXmlDocument(filename.c_str());
bool loadOkay = doc->LoadFile();
if ( !loadOkay )
{
throw GCN_EXCEPTION("Error parsing xml file.");
}
node = doc->FirstChild();
if(node == NULL)
{
throw GCN_EXCEPTION("Xml document is null or has errors.");
}
while(node!=NULL)
{
element = node->ToElement();
parseWidgets(element,NULL);
node = doc->IterateChildren(node);
}
return true;
}
void XmlGui::addToParent(gcn::Widget *widget,gcn::Widget *parent)
{
if(!parent) return;
gcn::Container* top = dynamic_cast<gcn::Container *>(parent);
if(top)
{
top->add(widget);
}
else
{
gcn::Window* window = dynamic_cast<gcn::Window *>(parent);
if(window)
// window->setContent(widget);
window->add(widget);
else
{
gcn::ScrollArea* scrollarea = dynamic_cast<gcn::ScrollArea *>(parent);
scrollarea->setContent(widget);
}
}
}
void XmlGui::parseWidgets(TiXmlElement *element, gcn::Widget *parent)
{
if(!element) return;
std::string value = element->Value();
if(value == "container")
parseContainer(element,parent);
if(value == "label")
parseLabel(element,parent);
else if(value == "radiobutton")
parseRadioButton(element,parent);
else if(value == "button")
parseButton(element,parent);
else if(value == "checkbox")
parseCheckBox(element,parent);
else if(value == "icon")
parseIcon(element,parent);
else if(value == "textbox")
parseTextBox(element,parent);
else if(value == "textfield")
parseTextField(element,parent);
else if(value == "slider")
parseSlider(element,parent);
else if(value == "window")
parseWindow(element,parent);
else if(value == "scrollarea")
parseScrollArea(element,parent);
else if(value == "dropdown")
parseDropdown(element,parent);
else if(value == "listbox")
parseListbox(element,parent);
}
void XmlGui::parseDefaults(TiXmlElement *element, gcn::Widget *widget)
{
if(!element) return;
if(element->Attribute("x"))
{
int x = atoi(element->Attribute("x")->c_str());
widget->setX(x);
}
if(element->Attribute("y"))
{
int y = atoi(element->Attribute("y")->c_str());
widget->setY(y);
}
if(element->Attribute("width"))
{
int w = atoi(element->Attribute("width")->c_str());
widget->setWidth(w);
}
if(element->Attribute("height"))
{
int h = atoi(element->Attribute("height")->c_str());
widget->setHeight(h);
}
if(element->Attribute("basecolor"))
{
int color;
sscanf(element->Attribute("basecolor")->c_str(),"%x",&color);
widget->setBaseColor(gcn::Color(color));
}
if(element->Attribute("foregroundcolor"))
{
int color;
sscanf(element->Attribute("foregroundcolor")->c_str(),"%x",&color);
widget->setForegroundColor(gcn::Color(color));
}
if(element->Attribute("backgroundcolor"))
{
int color;
sscanf(element->Attribute("backgroundcolor")->c_str(),"%x",&color);
widget->setBackgroundColor(gcn::Color(color));
}
if(element->Attribute("frame"))
{
int b = atoi(element->Attribute("framesize")->c_str());
widget->setFrameSize(b);
}
if(element->Attribute("font"))
{
if(fonts[*element->Attribute("font")])
widget->setFont(fonts[*element->Attribute("visible")]);
}
if(element->Attribute("visible"))
widget->setVisible(checkBool(*element->Attribute("visible")));
if(element->Attribute("focusable"))
widget->setFocusable(checkBool(*element->Attribute("focusable")));
if(element->Attribute("enabled"))
widget->setEnabled(checkBool(*element->Attribute("enabled")));
if(element->Attribute("tabin"))
widget->setTabInEnabled(checkBool(*element->Attribute("tabin")));
if(element->Attribute("tabout"))
widget->setTabOutEnabled(checkBool(*element->Attribute("tabout")));
if(element->Attribute("eventId"))
widget->setActionEventId(*element->Attribute("eventId"));
if(element->Attribute("actionListener"))
widget->addActionListener(actions[*element->Attribute("actionListener")]);
}
void XmlGui::parseContainer(TiXmlElement *element, gcn::Widget *parent)
{
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("Container Widget must have a unique name");
}
gcn::Container *c = new gcn::Container();
if(element->Attribute("opaque"))
c->setOpaque(checkBool(*element->Attribute("opaque")));
parseDefaults(element,c);
//parsing child elements
TiXmlNode *child = element->FirstChild();
if(child)
{
while(child)
{
TiXmlElement *e = child->ToElement();
parseWidgets(e,c);
child = doc->IterateChildren(child);
}
}
addToParent(c,parent);
widgets[name] = c;
}
void XmlGui::parseLabel(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = *element->Attribute("name");
}else
{
throw GCN_EXCEPTION("Label Widget must have a unique name");
}
gcn::Label *label = new gcn::Label;
if(element->Attribute("caption"))
{
label->setCaption(*element->Attribute("caption"));
}
label->adjustSize();
if(element->Attribute("align"))
{
if(*element->Attribute("align") == "center" || *element->Attribute("align") == "CENTER")
{
label->setAlignment(gcn::Graphics::CENTER);
}else if(*element->Attribute("align") == "left" || *element->Attribute("align") == "LEFT")
{
label->setAlignment(gcn::Graphics::LEFT);
}else
{
label->setAlignment(gcn::Graphics::RIGHT);
}
}
parseDefaults(element,label);
addToParent(label,parent);
widgets[name] = label;
}
void XmlGui::parseButton(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("Button Widget must have a unique name");
}
gcn::Button *button = new gcn::Button;
if(element->Attribute("caption"))
{
button->setCaption(*element->Attribute("caption"));
}
if(element->Attribute("align"))
{
if(*element->Attribute("align") == "center" || *element->Attribute("align") == "CENTER")
{
button->setAlignment(gcn::Graphics::CENTER);
}else if(*element->Attribute("align") == "left" || *element->Attribute("align") == "LEFT")
{
button->setAlignment(gcn::Graphics::LEFT);
}else
{
button->setAlignment(gcn::Graphics::RIGHT);
}
}
button->adjustSize();
parseDefaults(element,button);
// button->lostFocus(); //fix: this call must't exists
//?????
addToParent(button,parent);
widgets[name] = button;
}
void XmlGui::parseCheckBox(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("Checkbox Widget must have a unique name");
}
gcn::CheckBox *checkbox = new gcn::CheckBox;
if(element->Attribute("caption"))
{
checkbox->setCaption(*element->Attribute("caption"));
}
checkbox->adjustSize();
if(element->Attribute("selected"))
checkbox->setSelected(checkBool(*element->Attribute("selected")));
parseDefaults(element,checkbox);
addToParent(checkbox,parent);
widgets[name] = checkbox;
}
void XmlGui::parseRadioButton(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("RadioButton Widget must have a unique name");
}
gcn::RadioButton *radio = new gcn::RadioButton;
if(element->Attribute("caption"))
{
radio->setCaption(*element->Attribute("caption"));
}
radio->adjustSize();
if(element->Attribute("selected"))
radio->setSelected(checkBool(*element->Attribute("selected")));
if(element->Attribute("group"))
radio->setGroup(*element->Attribute("group"));
parseDefaults(element,radio);
addToParent(radio,parent);
widgets[name] = radio;
}
void XmlGui::parseIcon(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("Icon Widget must have a unique name");
}
gcn::Icon *icon;
gcn::Image *image;
if(element->Attribute("image"))
{
// image = new gcn::Image(*element->Attribute("image"));
image = gcn::Image::load(*element->Attribute("image"));
}
if(image)
{
icon = new gcn::Icon(image);
}
parseDefaults(element,icon);
addToParent(icon,parent);
widgets[name] = icon;
}
void XmlGui::parseTextBox(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("TextBox Widget must have a unique name");
}
gcn::TextBox *textbox = new gcn::TextBox;
if(element->Attribute("editable"))
textbox->setEditable(checkBool(*element->Attribute("editable")));
if(element->Attribute("text"))
{
textbox->setText(*element->Attribute("text"));
}
if(element->Attribute("opaque"))
textbox->setOpaque(checkBool(*element->Attribute("opaque")));
parseDefaults(element,textbox);
addToParent(textbox,parent);
widgets[name] = textbox;
}
void XmlGui::parseTextField(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("TextField Widget must have a unique name");
}
gcn::TextField *textfield = new gcn::TextField;
if(element->Attribute("text"))
{
textfield->setText(*element->Attribute("text"));
}
parseDefaults(element,textfield);
addToParent(textfield,parent);
widgets[name] = textfield;
}
void XmlGui::parseSlider(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("Slider Widget must have a unique name");
}
gcn::Slider *slider = new gcn::Slider;
if(element->Attribute("start"))
{
int start = atoi(element->Attribute("start")->c_str());
slider->setScaleStart(start);
}
if(element->Attribute("end"))
{
int end = atoi(element->Attribute("end")->c_str());
slider->setScaleEnd(end);
}
if(element->Attribute("value"))
{
int value = atoi(element->Attribute("value")->c_str());
slider->setValue(value);
}
if(element->Attribute("markerLength"))
{
int l = atoi(element->Attribute("markerLength")->c_str());
slider->setMarkerLength(l);
}
if(element->Attribute("stepLength"))
{
int l = atoi(element->Attribute("stepLength")->c_str());
slider->setStepLength(l);
}
if(element->Attribute("orientation"))
{
if(*element->Attribute("orientation") == "HORIZONTAL" || *element->Attribute("orientation") == "horizontal")
slider->setOrientation(gcn::Slider::HORIZONTAL);
else slider->setOrientation(gcn::Slider::VERTICAL);
}
parseDefaults(element,slider);
addToParent(slider,parent);
widgets[name] = slider;
}
void XmlGui::parseWindow(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = *element->Attribute("name");
}else
{
throw GCN_EXCEPTION("Window Widget must have a unique name");
}
gcn::Window *window = new gcn::Window;
if(element->Attribute("caption"))
{
window->setCaption(*element->Attribute("caption"));
}
if(element->Attribute("tabbing"))
{
window->setPadding(checkBool(*element->Attribute("tabbing")));
}
if(element->Attribute("movable"))
{
window->setMovable(checkBool(*element->Attribute("movable")));
}
if(element->Attribute("titleBarHeight"))
{
int h = atoi(element->Attribute("titleBarHeight")->c_str());
window->setTitleBarHeight(h);
}
if(element->Attribute("opaque"))
window->setOpaque(checkBool(*element->Attribute("opaque")));
parseDefaults(element,window);
//parsing child elements
TiXmlNode *child = element->FirstChild();
if(child)
{
while(child)
{
TiXmlElement *e = child->ToElement();
parseWidgets(e,window);
child = doc->IterateChildren(child);
}
}
window->resizeToContent();
addToParent(window,parent);
widgets[name] = window;
}
void XmlGui::parseScrollArea(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("ScrollArea Widget must have a unique name");
}
gcn::ScrollArea *scroll = new gcn::ScrollArea;
if(element->Attribute("hPolicy"))
{
if(*element->Attribute("hPolicy") == "ALWAYS" || *element->Attribute("hPolicy") == "always")
scroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_ALWAYS);
else if(*element->Attribute("hPolicy") == "NEVER" || *element->Attribute("hPolicy") == "never")
scroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
}
if(element->Attribute("vPolicy"))
{
if(*element->Attribute("vPolicy") == "ALWAYS" || *element->Attribute("vPolicy") == "always")
scroll->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_ALWAYS);
else if(*element->Attribute("vPolicy") == "NEVER" || *element->Attribute("vPolicy") == "never")
scroll->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
}
if(element->Attribute("vScrollAmount"))
{
int h;
sscanf(element->Attribute("vScrollAmount")->c_str(),"%d",&h);
scroll->setVerticalScrollAmount(h);
}
if(element->Attribute("hScrollAmount"))
{
int h = atoi(element->Attribute("hScrollAmount")->c_str());
scroll->setHorizontalScrollAmount(h);
}
if(element->Attribute("scrollBarWidth"))
{
int w = atoi(element->Attribute("scrollbarWidth")->c_str());
scroll->setScrollbarWidth(w);
}
if(element->Attribute("content"))
{
gcn::Widget *content = getWidget(*element->Attribute("content"));
if(content)
{
scroll->setContent(content);
}
}
parseDefaults(element,scroll);
if(!scroll->getContent())
{
//parsing child elements
TiXmlNode *child = element->FirstChild();
if(child)
{
while(child)
{
TiXmlElement *e = child->ToElement();
parseWidgets(e,scroll);
child = doc->IterateChildren(child);
}
}
}
addToParent(scroll,parent);
widgets[name] = scroll;
}
void XmlGui::parseDropdown(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("DropDown Widget must have a unique name");
}
gcn::DropDown *dropdown = new gcn::DropDown;
parseDefaults(element,dropdown);
XmlListModel *listmodel;
//parsing child elements
TiXmlNode *child = element->FirstChild();
if(child)
{
listmodel = new XmlListModel;
while(child)
{
TiXmlElement *e = child->ToElement();
if(e->Value() == "li")
{
listmodel->items.push_back(e->FirstChild()->Value());
}
child = doc->IterateChildren(child);
}
}
if(listmodel)
dropdown->setListModel(listmodel);
if(element->Attribute("selected"))
{
int s = atoi(element->Attribute("selected")->c_str());
dropdown->setSelected(s);
}
addToParent(dropdown,parent);
widgets[name] = dropdown;
}
void XmlGui::parseListbox(TiXmlElement *element,gcn::Widget *parent)
{
if(!element)
return;
std::string name;
if(element->Attribute("name"))
{
name = element->Attribute("name")->c_str();
}else
{
throw GCN_EXCEPTION("ListBox Widget must have a unique name");
}
gcn::ListBox *listbox = new gcn::ListBox;
parseDefaults(element,listbox);
XmlListModel *listmodel;
//parsing child elements
TiXmlNode *child = element->FirstChild();
if(child)
{
listmodel = new XmlListModel;
while(child)
{
TiXmlElement *e = child->ToElement();
if(e->Value() == "li")
{
listmodel->items.push_back(e->FirstChild()->Value());
}
child = doc->IterateChildren(child);
}
}
if(listmodel)
listbox->setListModel(listmodel);
if(element->Attribute("selected"))
{
int s = atoi(element->Attribute("selected")->c_str());
listbox->setSelected(s);
}
addToParent(listbox,parent);
widgets[name] = listbox;
}
gcn::Widget *XmlGui::getWidget(const std::string &name)
{
std::map<std::string,gcn::Widget*>::iterator it = widgets.find(name);
if(it == widgets.end()) {
return NULL;
}
return widgets[name];
}
bool XmlGui::checkBool(const std::string &value)
{
return (value == "1" || value == "true" || value == "True");
}
void XmlGui::addActionListener(const std::string &name, gcn::ActionListener *al)
{
if(al)
actions[name] = al;
}
void XmlGui::addFont(const std::string &name, gcn::Font *font)
{
if(font)
fonts[name] = font;
}
int XmlListModel::getNumberOfElements()
{
return items.size();
}
std::string XmlListModel::getElementAt(int i)
{
return items[i];
}