/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * macrowindow.cc * * Fri Aug 31 12:27:45 CEST 2007 * Copyright 2007 Lars Bisballe Jensen and Bent Bisballe Nyeng * elsenator@gmail.com and deva@aasimon.org ****************************************************************************/ /* * This file is part of Pracro. * * Pracro 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 2 of the License, or * (at your option) any later version. * * Pracro 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 Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "macrowindow.h" #include "sendrecieve.h" #include "widgets.h" #include "macro.h" #include #include #include #include #include #include #include "lua.h" extern QString cpr; extern QString user; extern QString host; extern quint16 port; MacroWindow::MacroWindow(QDomDocument *xml_doc) : QObject() { isclosed = false; this->lua = new LUA(this); // Execute the recursive function with documentElement recurser(xml_doc->documentElement(), NULL); } MacroWindow::~MacroWindow() { delete lua; } void MacroWindow::recurser(QDomNode xml_node, QWidget *parent) { QWidget *widget = NULL; QDomElement xml_elem = xml_node.toElement(); if(xml_elem.tagName() == "macro") { // Assign the macro name and version to QStrings for use when comitting if(xml_elem.hasAttribute("name")) macro = xml_elem.attribute("name"); if(xml_elem.hasAttribute("version")) version = xml_elem.attribute("version"); } else if(xml_elem.tagName() == "luaprograms") { // Nothing to do here } else if(xml_elem.tagName() == "luaprogram") { if(xml_elem.hasAttribute("name")) { luaprograms[xml_elem.attribute("name")] = xml_elem.text(); } } else if(xml_elem.tagName() == "window") { Window *window = new Window(xml_elem, this); widget = window; mainwidget = window; } else if(xml_elem.tagName() == "frame") { if(xml_elem.hasAttribute("caption")) { GroupBox *frame = new GroupBox(xml_elem, this); widget = frame; } else { Frame *frame = new Frame(xml_elem, this); widget = frame; } } else if(xml_elem.tagName() == "label") { Label *label = new Label(xml_elem, this); widget = label; } else if(xml_elem.tagName() == "lineedit") { LineEdit *lineedit = new LineEdit(xml_elem, this); widgets.push_back(lineedit); widget = lineedit; } else if(xml_elem.tagName() == "button") { PushButton *pushbutton = new PushButton(xml_elem, this); //connect(pushbutton, SIGNAL(act_continue()), main, SLOT(get_macro())); connect(pushbutton, SIGNAL(act_commit()), this, SLOT(commit())); connect(pushbutton, SIGNAL(act_reset()), this, SLOT(reset())); connect(pushbutton, SIGNAL(act_cancel()), this, SLOT(cancel())); connect(pushbutton, SIGNAL(act_continue(QString)), this, SLOT(cont(QString))); widget = pushbutton; } else if(xml_elem.tagName() == "textedit") { TextEdit *textedit = new TextEdit(xml_elem, this); widgets.push_back(textedit); widget = textedit; } else if(xml_elem.tagName() == "checkbox") { CheckBox *checkbox = new CheckBox(xml_elem, this); widgets.push_back(checkbox); widget = checkbox; } else if(xml_elem.tagName() == "radiobuttons") { RadioButtons *radiobuttons = new RadioButtons(xml_elem, this); widgets.push_back(radiobuttons); widget = radiobuttons; //return; // Don't iterate children } else if(xml_elem.tagName() == "combobox") { ComboBox *combobox = new ComboBox(xml_elem, this); widgets.push_back(combobox); widget = combobox; //return; // Don't iterate children } else if(xml_elem.tagName() == "listbox") { ListBox *listbox = new ListBox(xml_elem, this); widgets.push_back(listbox); widget = listbox; //return; // Don't iterate children } QDomNodeList children = xml_node.childNodes(); for (int i=0; ilayout()->addWidget(widget); if(widget != NULL) widget->show(); } bool MacroWindow::doCommit() { // Check for, and count, errors on all entries before comitting int faulty = 0; // 0 initial errors QVector< Widget* >::iterator i = widgets.begin(); while (i != widgets.end()) { Widget* w = *i; if(!w->isValid()) faulty++; // Regexp check, returns valid if entry passed i++; } // If all entries passed validation, continue commit if(faulty == 0) { printf("MacroWindow -> committing...\n"); // Build the XML commit QString xml_string; xml_string.append("\n"); xml_string.append("\n"); xml_string.append(" \n"); // Iterate the different entries, and append their results to the commit string QVector< Widget* >::iterator i=widgets.begin(); while (i != widgets.end()) { Widget* w = *i; xml_string.append(" getName() + "\" value=\"" + w->getValue() + "\"/>\n"); i++; } xml_string.append(" \n"); xml_string.append("\n"); // Print commit to stdout for debug purposes printf("%s\n", xml_string.toStdString().c_str()); // Convert the commit to Utf-8 charset QByteArray xml_array = xml_string.toUtf8(); QDomDocument xml_result; // Use setContent of QDomDocument to validate the xml commit if (!xml_result.setContent(xml_array)) { printf("Parse error: Invalid XML\n"); } // Commit the xml data to the server SendRecieve macro_commit(host, port); macro_commit.makeConnection(&xml_result); // Recieve answer from server whether successful or not //QByteArray ba = macro_commit.getResult(); QString ba = macro_commit.getResult(); printf("Server returned result: %s", ba.toStdString().c_str()); return true; } else { return false; } } void MacroWindow::close() { mainwidget->close(); isclosed = true; } void MacroWindow::commit() { if(doCommit()) { close(); } else { QMessageBox::critical(NULL, "Fejl", "Makroen er ikke udfyldt korrekt, prøv igen.\n" , QMessageBox::Ok); } } void MacroWindow::reset() { QMessageBox::warning(NULL, tr("Reset"), tr("Du har valgt at nulstille de indtastede data.\n" "Er du sikker?"), QMessageBox::Yes | QMessageBox::Cancel); printf("MacroWindow -> resetting...\n"); } void MacroWindow::cancel() { printf("MacroWindow -> cancelling...\n"); close(); } void MacroWindow::cont(QString name) { QString macro; QVector< Widget* >::iterator i=widgets.begin(); while (i != widgets.end()) { Widget* w = *i; if(w->getName() == name) { macro = w->getValue(); } i++; } if(doCommit()) { new_macro("FIXME", macro); close(); } else { QMessageBox::critical(NULL, "Fejl", "Makroen er ikke udfyldt korrekt, prøv igen.\n", QMessageBox::Ok); } printf("%s : MacroWindow -> continuing...\n", macro.toStdString().c_str()); } bool MacroWindow::isClosed() { return isclosed; } QString MacroWindow::getValue(QString name) { // Iterate the different entries, and append their results to the commit string QVector< Widget* >::iterator i=widgets.begin(); while (i != widgets.end()) { Widget* w = *i; if(name == w->getName()) return w->getValue(); i++; } return name + " - No such field!"; } void MacroWindow::setValue(QString name, QString value) { // Iterate the different entries, and append their results to the commit string QVector< Widget* >::iterator i = widgets.begin(); while (i != widgets.end()) { Widget* w = *i; if(name == w->getName()) w->setValue(value); i++; } }