diff options
Diffstat (limited to 'client/macrowindow.cc')
-rw-r--r-- | client/macrowindow.cc | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/client/macrowindow.cc b/client/macrowindow.cc new file mode 100644 index 0000000..74e8d54 --- /dev/null +++ b/client/macrowindow.cc @@ -0,0 +1,256 @@ +/* -*- 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 <QVBoxLayout> +#include <QMessageBox> +#include <QDomDocument> +#include <QDomElement> +#include <QDomNode> +#include <QByteArray> + +extern QString cpr; +extern QString user; +extern QString host; +extern quint16 port; + +MacroWindow::MacroWindow(QDomDocument *xml_doc) + : QObject() +{ + isclosed = false; + + // Execute the recursive function with documentElement + recurser(xml_doc->documentElement(), NULL); +} + +MacroWindow::~MacroWindow() +{ +} + +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() == "window") { + Window *window = new Window(xml_elem); + widget = window; + mainwidget = window; + + } else if(xml_elem.tagName() == "frame") { + if(xml_elem.hasAttribute("caption")) { + GroupBox *frame = new GroupBox(xml_elem); + widget = frame; + } else { + Frame *frame = new Frame(xml_elem); + widget = frame; + } + + } else if(xml_elem.tagName() == "label") { + Label *label = new Label(xml_elem); + widget = label; + + } else if(xml_elem.tagName() == "lineedit") { + LineEdit *lineedit = new LineEdit(xml_elem); + widgets.push_back(lineedit); + widget = lineedit; + + } else if(xml_elem.tagName() == "button") { + PushButton *pushbutton = new PushButton(xml_elem); + //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); + widgets.push_back(textedit); + widget = textedit; + + } else if(xml_elem.tagName() == "checkbox") { + CheckBox *checkbox = new CheckBox(xml_elem); + widgets.push_back(checkbox); + widget = checkbox; + + } else if(xml_elem.tagName() == "radiobuttons") { + RadioButtons *radiobuttons = new RadioButtons(xml_elem); + widgets.push_back(radiobuttons); + widget = radiobuttons; + //return; // Don't iterate children + + } else if(xml_elem.tagName() == "combobox") { + ComboBox *combobox = new ComboBox(xml_elem); + widgets.push_back(combobox); + widget = combobox; + //return; // Don't iterate children + + } else if(xml_elem.tagName() == "listbox") { + ListBox *listbox = new ListBox(xml_elem); + widgets.push_back(listbox); + widget = listbox; + //return; // Don't iterate children + } + + QDomNodeList children = xml_node.childNodes(); + + for (int i=0; i<children.count();i++) { + QDomNode child = children.at(i); + recurser(child, widget); + } + + if(parent != NULL && widget != NULL) parent->layout()->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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + xml_string.append("<pracro version=\"1.0\" cpr=\"" + cpr + "\" user=\"" + user + "\">\n"); + xml_string.append(" <commit macro=\"" + macro + "\" version=\"" + + version + "\">\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(" <field name=\"" + w->getName() + + "\" value=\"" + w->getValue() + "\"/>\n"); + i++; + } + + xml_string.append(" </commit>\n"); + xml_string.append("</pracro>\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; +} |