/*************************************************************************** * Copyright (C) 2005 by the G System Team * * http://www.g-system.at * * * * Permission is hereby granted, free of charge, to any person obtaining * * a copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, sublicense, and/or sell copies of the Software, and to * * permit persons to whom the Software is furnished to do so, subject to * * the following conditions: * * * * The above copyright notice and this permission notice shall be * * included in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.* * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * * OTHER DEALINGS IN THE SOFTWARE. * ***************************************************************************/ #include "GweXmlConfigurator.h" #include #include #include #include #include #include #include #include namespace GOD { GListViewOptionItem::GListViewOptionItem(GWE::GweFactoryOption* option, QListView* parent) : QListViewItem(parent,option->getOptionName(),option->getValue(),option->getDescription()), AssociatedOption(option) { this->setRenameEnabled(1,true); // value this->setRenameEnabled(2,true); // description } GListViewOptionItem::GListViewOptionItem(GWE::GweFactoryOption* option, QListViewItem* parent) : QListViewItem(parent,option->getOptionName(),option->getValue(),option->getDescription()), AssociatedOption(option) { this->setRenameEnabled(1,true); // value this->setRenameEnabled(2,true); // description } GListViewOptionItem::~GListViewOptionItem() { } void GListViewOptionItem::okRename(int col) { QListViewItem::okRename(col); qDebug(QString("Option ") + AssociatedOption->getOptionName() + ", column " + QString::number(col) + " changed to " + text(col)); if (col==1) { this->AssociatedOption->setValue(text(col)); emit this->valueChanged(AssociatedOption,this->text(col)); } else if (col==2) { this->AssociatedOption->setDescription(text(col)); emit this->descriptionChanged(AssociatedOption,this->text(col)); } } GweXmlConfigurator::GweXmlConfigurator(const QString& url, QWidget *parent, const char *name) : GweXmlConfiguratorBase(parent, name), Factory(new GWE::GWorldEngineFactory()) { this->UrlRequester->setMode(KFile::File); this->OptionsTree->addColumn("Option"); this->OptionsTree->addColumn("Value"); this->OptionsTree->addColumn("Description"); this->OptionsTree->setRenameable(0,false); // option name this->OptionsTree->setRenameable(1); // value this->OptionsTree->setRenameable(2); // description this->OptionsTree->setItemsRenameable(true); this->UrlRequester->setURL(url); if (!url.isEmpty()) { qDebug(QString("Loading options from given file: %1").arg(url)); if (!loadFromUrl(url)) { qWarning("File could not be loaded, setting it as filename anyway and starting a fresh configuration."); this->updateOptionsView(); KMessageBox::information(this,QString("The chosen configuration file %1 does not yet exist, make sure you save before closing!").arg(url)); } } else { qDebug("No file given, starting a fresh configuration."); this->updateOptionsView(); } connect(UrlRequester,SIGNAL(returnPressed(const QString&)),this,SLOT(loadFromUrl(const QString& ))); connect(UrlRequester,SIGNAL(urlSelected(const QString&)),this,SLOT(loadFromUrl(const QString& ))); connect(ButtonReset,SIGNAL(clicked()),this,SLOT(loadConfiguration())); connect(ButtonSave,SIGNAL(clicked()),this,SLOT(saveConfiguration())); } GweXmlConfigurator::~GweXmlConfigurator() { } bool GweXmlConfigurator::loadFromUrl(const QString& url) { QFile file(url); if (file.open(IO_ReadOnly)) { qDebug(QString("file opened in read only mode: ") + url); QDomDocument xml; QString error_msg; int line,col; if (!xml.setContent(&file,&error_msg,&line,&col)) { qWarning("failed to load XML data from file!"); qWarning(QString::number(line) + ":" + QString::number(col) + ": " + error_msg); } else { Factory->getRootOption()->loadFromXml(xml.documentElement()); qDebug("factory settings loaded from file"); } file.close(); } else { return false; } //load the config from the factory into the klistview tree updateOptionsView(); return true; } bool GweXmlConfigurator::saveToUrl(const QString& url) { QFile file(url); if (file.open(IO_WriteOnly)) { qDebug(QString("file opened for writing: ") + url); QDomDocument xml; QDomElement root_element = xml.createElement(Factory->getRootOption()->getOptionName()); if (root_element.isNull()) { qWarning("couldn't create root element"); } else { xml.appendChild(root_element); Factory->getRootOption()->saveToXml(root_element); qDebug("writing xml to file"); file.writeBlock(xml.toString(),xml.toString().length()); } file.close(); } else { qWarning("failed to save the configuration"); KMessageBox::error(this,"Failed to save configuration.\n Make sure you have write permissions."); return false; } return true; } bool GweXmlConfigurator::loadConfiguration() { return this->loadFromUrl(this->UrlRequester->url()); } bool GweXmlConfigurator::saveConfiguration() { return this->saveToUrl(this->UrlRequester->url()); } void GweXmlConfigurator::updateOptionsView() { qDebug("updating options view"); this->OptionsTree->clear(); GWE::GweFactoryOption* option = this->Factory->getRootOption(); if (option) { GListViewOptionItem* item = new GListViewOptionItem(option,this->OptionsTree); connect(item,SIGNAL(valueChanged(GWE::GweFactoryOption*, const QString& )), this,SLOT(updateOptionsView())); updateSubOptions(option,item); item->setOpen(true); this->OptionsTree->update(); } } void GweXmlConfigurator::updateSubOptions(GWE::GweFactoryOption* option, QListViewItem* parent) { qDebug(QString("updating for suboption ") + option->getOptionName()); option->updateTree(); QValueList sub_options = option->getSubOptions(); if (sub_options.isEmpty()) return; QValueList::iterator it; for (it = sub_options.begin(); it != sub_options.end(); ++it) { GListViewOptionItem* item = new GListViewOptionItem((*it),parent); connect(item,SIGNAL(valueChanged(GWE::GweFactoryOption*, const QString& )), this,SLOT(updateOptionsView())); updateSubOptions((*it),item); item->setOpen(true); } } }